Redis

Redis: Remote Dictionary Server

三个特点:

  • Redis 支持数据持久化. 可以将内存中的数据保持在磁盘中, 重启后可再次使用
  • Redis 支持 key-val, list, set, zset, hash 等数据结构存储
  • Redis 支持数据备份, master-slave 模式数据备份

零碎基础知识

  1. 单进程 (*) 单进程处理客户端的请求, 对读写事件响应是通过 epoll 函数而包装来操作. Redis 实际处理速度完全依靠主进程执行效率
  2. 默认 16 个数据库, 类似数组下标从 0 开始, 初始默认使用 0 号库
  3. select 切换数据库
  4. dbsize 查看当前数据库的 key 的数量
  5. flushdb 清空当前数据库
  6. flushall 删全部库
  7. 统一密码管理, 16 个库同一个密码
  8. Redis 索引是从 0 开始
  9. 默认端口 6379

Redis 数据类型

五大数据类型

  1. String (字符串)
  2. Hash (哈希, 类似 Java HashMap)
  3. List (列表)
  4. Set (集合)
  5. Zset (Sorted Set: 有序集合)

String (字符串)

  1. 一个 key 对应一个 value
  2. 二进制安全. 可以包含任何数据, 包括图片或者序列化对象
  3. value 最多可以是 512M

Hash

  1. string 类型的 field 和 value 的映射表

List (列表)

  1. 底层是一个链表
  2. 按照插入顺序排序, 可以在头部或者尾部插入数据

Set

  1. string 类型的无序集合, 是通过 HashTable 实现的

Zset (Sorted Set)

  1. string 类型的集合
  2. 与 Set 不同的是: 每个元素都会关联一个 double 类型的分数
  3. Redis 通过分数来为集合中的成员进行从小到大排序
  4. zset 成员唯一, 但是分数 (score) 可以重复!

Redis 键 (key)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
key *

# 判断某个 key 是否存在
exists key

# 将 key 移动到另一个库
move key db

# 给 key 设置过期时间
expire key

# 查看还有多长时间 key 过期, -1 表示永不过期, -2 表示已经过期
ttl key

# 移除key的过期时间,即设置回永不过期
persist key

# 查看 key 是什么类型
type key

get k1

# 有对应的键值, 覆盖 value
set k1 v1

# 删除 key
del key

Redis 字符串 (String)

单值单 value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set / get / del / append / strlen
incr / decr / incrby / decrby

# 获取指定区间范围的值
getrange key 0 -1

# 范围内设置值 (结果 key 对应的 value 以 'xxx'开头)
setrange key 0 xxx

# 设置过期时间
setex

# set if not exist
setnx

# 设置 / 获取 多个键值对
mset / mget / msetnx

Redis 列表 (List)

单值多 value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
lpush / rpush / lrange

lpop / rpop

# 按照索引下标获得元素 (从上到下)
lindex

llen

# 删除 n 个 val
lrem key n val

# 截取指定范围的值然后再赋值给 key
ltrim key index1 index 2

# 源列表 -> 目标列表
rpoplpush list1 list2

lset key index value

linsert key before/after val1 val2

性能总结

  1. 是一个字符串链表, left, right 都可以插入添加
  2. 如果键不存在, 创建新的链表
  3. 如果键已存在, 新增内容
  4. 如果值完全移除, 对应的键也就消失了
  5. 链表操作头尾效率很高, 中间元素效率不高

Redis 集合 (Set)

单值多 value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sadd / smembers / sismembers

# 获取集合里元素个数
scard

# 删除集合中元素
srem key value

srandmember key 某个整数

# 随机 pop 元素
spop key

# 将 key1 里的某个值赋值给 key2
smove set01 set02 5

# 差集 / 交集 / 并集
sdiff / sinter / sunion

Redis 哈希 (Hash)

KV 模式不变, 但 V 是一个键值对

1
2
3
4
5
6
7
8
9
10
11
12
hset / hget / hmset / hmget / hgetall / hdel

hlen

# 在 key 里面的某个值的 key
hexists key

hkeys / hvals

hincrby / hincrbyfloat

hsetnx

Redis 有序集合 (Zset)

1
2
3
4
5
6
7
8
9
10
11
12
zadd / zrange (withscores)

# 开始 score1 结束 score2
zrangebyscore key score1 score2
withscore
'(' 不包含
limit 开始下标步, 多少步

# 删除元素
zrem key 某 score 下对应的 value

zcard / zcount key <score_range> / zrank key values

Reference

  1. https://zhenye-na.github.io/2019/08/29/redis-cheatsheet.html#redis-%E4%BA%8B%E5%8A%A1

  2. https://github.com/LeCoupa/awesome-cheatsheets/blob/master/databases/redis.sh