Binary-safe string: 字符串, Binary-safe 的意思是它本身不会应为某些特殊字符而导致字符串结束了, 他可以包含任何字符. 比如在 C 中, 字符串的结尾是'\0', 意味着这个字符之后的不能被当做当前字符的
Lists: 存储 string 的链表, 存储顺序即插入顺序 (不是通过数组实现)
Sets: 每个字符串唯一的存储集合
Sorted Sets: 存储的每一个字符串都是唯一的, 同时每个字符串会具备一个 score 的属性
Hashes: 存储 key 和 value 的映射关系, key 和 value 都是 string
Bit Array: 像 bit 数组一样处理 String 值, 每一个 bit 都可以 set 和 clear, 计算 1 的数量等等
HyperLogLogs: 用来估计 set 中唯一值的个数
Redis 的 key
key 可以包含任意得字符, 比如将一张 JPEG 文件内容作为 key. 空字符串也是一个有效的 key.Redis 的 key 使用时, 有一些建议:
key 最好不要太长. 超过 1024bytes 的 key 一个是占用内存, 再者每次去找 key 做匹配也是需要一些时间的
可用通过 hash 来解决, 比如使用 SHA1
key 太短也不好. 比如 "user:1000:followers" 显然比 "u1000flw" 拥有更好的可读性, key 本身的这点增长所需要的空间比起 key 对象和 object 对象来说可以忽略
自己掌握好这里头的平衡
尝试遵循一定的模式. 比如以 "object-type:id" 这种方式来作为 key 的规则
key 最大 512M
设置 key 过期
EXPIRE 命令用来设置过期
过期的精度可以是秒或者毫秒
过期时间的分辨率一直是毫秒
过期时间本身会被持久化, 即使 Redis 本身停止服务了, 停服期间过期的时间还是同样计算
使用 PERSIST 可以去掉过期时间, 永久保留 key
String
SET 命令来设置 string 类型值, 它会替代已经存储在 Redis 中的 key 的值, 即使原来存储的值类型不是 string
value 大小不能超过 512M
如果 SET 值时, 发现已经存储, 则不覆盖原值, 可以通过
set mykey myValue nx
, 即后面跟 nx 来实现这种语义; 另外如果仅想在 key 存在的时候覆盖, 可以通过
set mykey myValue xx
即后面跟 xx 来实现这种语义
批量获取使用 MSET, 对应 GET 为 MGET
set key value ex 10 设置 10 秒后过期
INCR 命令会把 string 类型值当做 integer, 实现自增 1, 如果 key 不存在, 它会被置为 0, 然后再自增 1. 如果 string 不能当做 integer 会抛出异常
自增的上限是 64 bit 的 integer.
类似的命令有 INCRBY , 可自定义增长的大小. 其余还有 DECR DECRBY
INCR 命令是原子操作.
EXISTS 判断 key 是否存在
DEL 删除 key
TYPE 判断 key 的类型
TTL 获取 key 的存活时间
LIST
LPUSH 命令向 list 头添加元素只需要常量时间, 可一次添加多个
RPUSH 命令向 list 尾部添加元素只需要常量时间, 可一次添加多个
LRANGE 提取 list 中一定范围内的元素, 比如 lrange mylist 0 -1 , 范围是两个索引, 都可以是负数,-1 表示最后一个,-2 表示倒数第 2 个, 依此类推
RPOP 返回 list 中的最后一个元素, 并从 list 中移除它, 如果没有元素了就返回 NULL
LTRIM 保留给定索引范围之内的数据, list 中的其余值都删掉
BRPOP 从 list 中返会并删除最后一个元素, 如果列表没有值, 就阻塞, 根据阻塞的时间, 如果是 0, 就一直阻塞直到有值存在, 大于 0 则阻塞相应的时间长度
BLPOP 对应 BRPOP 操作第一个元素
使用 brpop/blpop 需要注意:
客户端的请求处理是按照顺序来的, 第一个阻塞的当有其它客户端插入数据会第一个处理
它的返回会有两个值
超时返回 NULL
自动创建和移除 keys
当往 Redis 中没有对应 key 存在的集合中 push 元素或者删除一个空的集合, Redis 需要主动的去创建空的集合或者是删除没有值的 key. 对应的操作有三条规则:
当往集合中添加元素, 如果目标的 key 不存在, 在添加之前 Redis 会首先创建一个空的集合
当从集合中移除一个元素, 如果 value 移除后是空的, key 就会被删掉
使用形如 LLEN 的只读命令, 或者是使用移除元素的命令, 来操作一个不存在的 key,Redis 的表象就像 key 本身的 value 是一个空集合一样
Hash
使用 hash 能够用来代表一个对象, 放到 hash 里面的字段数量理论上是没有限制的
hmset: 往 hash 中塞多个字段
hget: 获取当个的字段
hmget: 以数组形式返回值
hincrby: 对单个字段进行递增操作
- hmset user:1000 name paxi verified 1 a 10 // 塞入 user 的多个字段
- hget user:1000 name // 获取 name 字段值
- hmget user:1000 name verified // 以数组形式返回值, key 不存在返回 null
- hincrby user:1000 a 10 // 将字段 a 增加 10
Set
set 在 Redis 中用来存储 string 的无序集合.
sadd: 往 set 中添加新的元素, 可以单个或者批量的添加
smembers: 获取 set 中的所有元素
sismember: 校验某个元素是不是属于给定结合
sinter: 获取多个 set 的交集
spop: 从 set 中随机删除一个元素, 并返回它的值
sunionstore: 取多个 set 中的并集
scard: 计算 set 中唯一值的个数(集合论中的基数)
- sismember myset 1 // 判断 1 是不是在集合 myset 中
- sunionstore myset1 myset2 // 假如 myset1 不存在, 就相当于把 myset2 中的元素拷贝到了 myset1
Sorted sets
用来存储唯一的 string, 它每一个值都包含一个 score 属性, 它会根据如下规则排序
如果 A 和 B 两个元素有有不同的 score, 且 A.score> B.score, 那么 A>B
如果 A 和 B 有着一样的 score, 如果从字面排序上 A 比 B 要排在前面, 那么 A>B
它内部实现是 dual-ported 数据结构 , 内部同时包含了 skip list 和 hash table, 每次添加元素的时间是 O(lgN), 但是获取的时间是常量的
zadd: 往 sorter sets 中添加元素, 可以同时添加多个, 添加同样的 key 则会更新元素本身的 score
zrange: 按顺序获取集合中一段索引范围之内的元素
zrevrange: 按逆序获取集合中一段索引范围之内的元素
zrangebyscore: 取 score 范围内的元素
zremrangebyscore: 移除 score 范围内的元素
zrank: 获取特定 key 的排序位置
- zadd hackers 1940 "Alan Kay" // 往 hackers 中添加 "Alan key" 它的 score 是 1940
- zrange hackers 0 -1 withscores // 按照顺序获取 hackers 中的所有元素, 0 表示第一个,-1 表示最后一个, 同时返回对应元素的分数
- zrevrange hackers 0 -1 // 按照逆序
Bitmaps
它并非一种数据结构, 而是在 string 类型上定义的一种面向 bit 的操作. 它最大的优势是能节省空间
setbit : 设置 key 的特定位置的 bit 值为 0 或者 1, 当 key 的长度不够会自动扩充
getbit: 返回特定索引位置的 bit 值, 范围外的 bit 返回 0
bitop: 提供 bit 级别的操作, 包括 AND OR XOR NOT
bitcount: 计算 bit 值是 1 的个数
bitpos: 找到第一个指定的值 (指定 0 或者 1) 的位置
HyperLogLogs
它是一种概率数据结构, 用来统计唯一的值. 一般统计唯一的值的时候, 需要记录所有已经访问过的元素, 这会消耗大量的内存, 但是使用 HyperLogLogs 只需要使用常量的内存, 最差的情况下爱只需要 12k, 此时的精度不会差于 1%.
pfadd: 往 其中添加元素
pfcount: 计算元素的个数
HyperLogLogs 实际只存储了一个状态, 并不包含真实的元素的值
Redis 官网介绍 https://Redis.io/topics/data-types-intro
来源: https://juejin.im/post/5bb971f85188255c791b194f