Redis 笔记
Redis 笔记
Redis 常用五大数据类型
字符串(String)
数据结构
String 的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。
即可以修改的字符串,内部结构实现类似 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

如上图,内部为当前时间分配空间 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> |
返回集合key1和key2的交集 |
sunion <key1> <key2> |
返回集合key1和key2的并集 |
sdiff <key1> <key2> |
返回集合key1和key2的差集 |
哈希(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 中某个偏移量的值(0 或 1) |
getbit <key> <offset> |
获取 Bitmaps 中偏移量的值 |
bitcount <key> [start end] |
统计指定字节下标范围内被设置为 1 的 bit 数 |
bitop and/or/not/xor <destkey> [key ...] |
复合操作,它可以做多个 Bitmaps 的 and、or、not、xor 操作,并将结果保存在 destkey 中 |
HyperLogLog
数据说明
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是在输入元素和数量或体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
| 命令 | 功能 |
|---|---|
pfadd <key> [element ...] |
添加指定元素到 HyperLogLog 中 |
pfcount <key> [key ...] |
统计指定 HyperLogLog 中的基数 |
pfmerge <destkey> <sourcekey> [sourcekey ...] |
合并 HyperLogLog 到 destkey 中 |
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 |







