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 类型的 fieldvalue 的映射表

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