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