Redis 笔记

Redis 常用五大数据类型

字符串(String)

数据结构

String 的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。

即可以修改的字符串,内部结构实现类似 JavaArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

![String 内存分配空间图](D:\笔记\imgs\String 内存分配空间图.png)

如上图,内部为当前时间分配空间 capacity,一般要高于字符串实际长度 len

当字符串长度小于 1M 时,扩容都是将当前空间加倍。但当超过 1M 时,扩容一起只会多扩容 1M 的空间大小。

另外需要注意的是,字符串长度最大为 512M

命令 功能
set <key> <value> 添加键值对数据
get <key> 查询对应键所对应的值
append <key> <value> 在对应键的值尾部追加新的值
strlen <key> 获取键对应值的长度
incr/decr <key> 将此键存储的数值 ±1
incrby/decrby <key> <step> 将此键存储的数值 ±对应步长值
mset <key1> <value1> <key2> <value2> ... 批量添加键值对数据
mget <key1> <key2> ... 批量获取多键对应的值
msetnx <key1> <value1> <key2> <value2> ... 若所有键都不存在,那么就批量添加键值对数据,反之不添加
getrange <key> <start> <end> 获取到键对应索引位置的数据,包含开始和结束索引
setrange <key> <start> <value> 将此键的值对应索引位置往后进行覆写新值
setex <key> <time> <value> 添加数据时同时设置过期时间
getset <key> <value> 设置新的值返回获取旧值

列表(List)

数据结构

List 的数据结构为压缩列表 (ziplist) 及快速链表 (quickList)

当元素较少的情况下,会使用 ziplist,当元素较多时,使用 quickList

以为普通链表需要附加指针空间,较为浪费空间。Redis 将链表和压缩列表组成了快速链表,也就是将多个 压缩链表用双向指针串联起来使用。

命令 功能
lpush/rpush <key> <value1> <value2> ... 从左/右插入一个或多个值
lpop/rpop <key> 从左/右弹出一个键对应的值,值毁键亡
rpoplpush <key1> <key2> key1最右边的键值对压入key2的最左边
lrange <key> <sindex> <eindex> 查看对应键列表索引范围内的元素,当sindex=0, eindex=-1表示查看此列表所有元素
lidnex <key> <index> 按照下标获得键对应列表的元素
llen <key> 获取列表长度
linsert <key> before/after <value> <newvalue> 将在此键对应value前/后插入新值newvalue
lrem <key> <n> <value> 从左边删除第n个值为value的元素
lset <key> <index> <value> 将列表key下标为index的值替换为value

集合(Set)

数据结构

Set 集合的数据集使用的就是 Hashtable(哈希表)

命令 功能
smembers <key> 查看当前键的集合元素
sadd <key> <value1> <value2> ... 添加元素到key或创建含有元素的key集合
sismember <key> <value> 判断value是否存在集合key
scard <key> 获取集合长度
srem <key> <value> key集合中对应的value移除
spop <key> 随机弹出一个key集合中的元素
srandmember <key> <n> 随机获取n个集合key的元素
smove <key1> <key2> <value> key1集合的value元素移动到集合key2
sinter <key1> <key2> 返回集合key1key2的交集
sunion <key1> <key2> 返回集合key1key2的并集
sdiff <key1> <key2> 返回集合key1key2的差集

哈希(Hash)

数据结构

Hash 类型对应的数据结构是 ziplist(压缩列表), hashtable(哈希表)

field - value 长度较短时使用的是 ziplist,否则使用的是 hashtable

命令 功能
hset <key> <field1> <value1> <field2> <value2> ... 添加或更新key的哈希中的属性与属性值(Redis 4.0前不允许批量添加)
*hmset <key> <field1> <value1> <field2> <value2> ... 已弃用,Redis 4.0前进行批量添加hash元素的方法
hget <key> <field> key哈希中获取属性为field的属性值
hexists <key> <field> 判断哈希中是否存在field属性
hkeys <key> 返回key所对应的哈希所有的field
hvals <key> 返回key所对应的哈希所有的value
hincrby <key> <field> <increment> key中的field属性进行增量increment
hsetnx <key> <field> <value> key中不存在field属性,则添加对应属性

有序集合(Zset)

数据结构

Zset 类型底层对应使用了的数据结构是 hash, 跳跃表

hash 作用是关联元素 value 和权重 score,保障 value 的唯一性,可以通过 value 找到对应的 score

跳跃表 目的是在于给元素 value 排序后,能快速的根据 score 的范围获取元素列表,效率堪比红黑树,但实现比其简单

命令 功能
zadd <key> <score1> <member1> <score2> <member2> ... 将一个或多个元素及其权重值加入道有序集合中
zrange <key> <start> <stop> [WITHSCORES] 从小到大,返回有序集合下标在 start ~ stop 之间的元素
zrevrange <key> <start> <stop> [WITHSCORES] 从大到小,返回有序集合下标在 start ~ stop 之间的元素
zrangebyscore <key> <min> <max> [WITHSCORES] [limit offset count] 从小到大,返回有序集合权重在 min ~ max 之间的元素
zrevrangebyscore <key> <max> <min> [WITHSCORES] [limit offset count] 从大到小,返回有序集合权重在 min ~ max 之间的元素
zincrby <key> <increment> <member> 为对应有序集合中的 member 得分加上 invrement
zrem <key> <member1> <member2> ... 将有序集合中的 member 删除
zcount <key> <min> <max> 获取该有序集合权重区间在 min ~ max 之间的元素
zrank <key> <member> 返回该 member 在有序集合中的权重得分

Redis 新数据类型

Bitmaps

数据说明

Bitmaps 本身不算一种数据类型,本质上 Bitmaps 就是字符串,但是它可以对字符串进行位操作。

命令 功能
setbit <key> <offset> <value> 设置 Bitmaps 中某个偏移量的值(01
getbit <key> <offset> 获取 Bitmaps 中偏移量的值
bitcount <key> [start end] 统计指定字节下标范围内被设置为 1bit
bitop and/or/not/xor <destkey> [key ...] 复合操作,它可以做多个 Bitmapsandornotxor 操作,并将结果保存在 destkey

HyperLogLog

数据说明

HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是在输入元素和数量或体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

命令 功能
pfadd <key> [element ...] 添加指定元素到 HyperLogLog
pfcount <key> [key ...] 统计指定 HyperLogLog 中的基数
pfmerge <destkey> <sourcekey> [sourcekey ...] 合并 HyperLogLogdestkey

Geospatial

数据说明

Geographic(缩写GEO) 主要用于表示地理位置信息的数据,该数据类型提供了经纬度的设置、查询、范围查询、距离查询、经纬度 Hash 等常见操作。

命令 功能
geoadd <key> <longitude> <latitude> <member> [longitude latitude member ...] 添加一个或多个成员地区的经纬度
geopos <key> <member> [member ...] 获取一个或多个成员的经纬度
`geodist <key> <member1> <member2> [m km
`georadius <key> <longitude> <atitude> <radius> <m km