一、Redis特性
1、速度快、持久化、多种数据结构、支持多种开发语言、功能丰富、简单、主从复制、高可用,分布式
2、数据结构:String、Hash、List、Set、Zset、BitMap、HyperLogLog、GEO
3、单线程 + 多路 IO 复用
二、数据类型
String
实际分配的空间 caoacity 一般要高于实际字符串的长度。当字符串长度小于1M时,扩容是加倍现有空间的;当超过1M时,扩容一次只会多扩容1M的空间;字符串最大传递为512M
1、赋值
set key “value”
2、取值
get key
3、同时赋多个值
mset key1 value1 [key2 value2…]
4、获取多个值
mget key1 [key2…]
5、先返回旧值再赋新值
getset key value
6、设置key同时设置过期时间
setex key 过期时间 value
7、 key 不存在时才赋值
setnx key value
8、所有 key 不存在时才赋值
msetnx key1 value1 [key2 value2…]
9、截取范围的值(索引从0开始,包含start/stop)
getrange key [start stop]
10、用value替换从start起对应位置的值(索引从0开始,包含start)
setrange key start value
示例:
1、set name mynameluck
2、setrange name 2 abc
3、get name
结果:myabceluck
11、自增 1(key 的 value 值必须为数值)
incr key
12、自减 1(key 的 value 值必须为数值)
decr key
13、自增指定数值(key 的 value 值必须为数值)
incrby key 步长
14、自减指定数值(key 的 value 值必须为数值)
decrby key 步长
15、在key的值后面追加value
append key value
16、获取值的长度
strlen key
17、编码方式1
int:8 个字节的长整型
18、编码方式2
embstr:大于 8 个字节且小于等于 39 个字节的字符串
19、编码方式3
raw: 大于 39 个字节的字符串
20、字符串最大存储
512M
Hash
- hash对应两种数据结构:ziplist、hashtable,当field-value 长度较短时使用ziplist,否则使用 hashtable
1、单个赋值
hset key field value
- 例:hset aa field1 3
2、 单个取值
hget key field
- 例:hget aa field1—>结果:3
3、 多个赋值
hmset key field1 value [field2 value…]
- 例:hmset bb fielda 1 fieldb 2
4、多个取值
hmget key field1 field2
- 例:hmget bb fielda fieldb
- 结果:1 2
5、查看 key 中的 field 是否存在
hexists key field
6、获取集合中的所有 field
hkeys key
7、获取集合中的所有 value
hvals key
8、为key中的field 的value 增加 数值,类似于String 中的 incrby
hincrby key field increment
- 例:hincrby test age 2
9、当field不存在时,为该field赋值
hsetnx key field value
10、获取指定key的所有field和value
hgetall key
11、编码方式1
ziplist(压缩列表):当哈希类型中元素个数小于 hash-max-ziplist-entries 配置(默认 512个),同时所有字节都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现
12、 编码方式2
hashtable(哈希表):当上述条件不满足时,Redis 则会采用 hashtable 作为哈希的内部实现
List
-
List 在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,即压缩列表。当数据量比较多时才会改为quicklist
-
以为普通链需要附加指针(prev、next)空间太大,比较浪费空间
-
redis将普通链表和ziplist结合起来组成了quicklist,也就是将多个ziplist使用双向指针串起来,这样既满足了快速插入性能,又不会出现太大的空间浪费
1、在list头部添加元素
lpush “key” value [value…]
- 例:lpush list_key 1 2 3
2. 在list尾部添加元素
rpush “key” value [value…]
- 例:rpush list_key a b c
3、从左边移除元素并返回该元素
lpop key
4、从右边移除元素并返回该元素
rpop key
5、从第一个key1中弹出最右的元素并将该元素加入到第二个key2的头部
rpoplpush key1 key2
6、按照索引获取list元素
start与stop分別为起始位置以及结束位置;start=0 、stop =-1 时表示获取所有
lrange key1 start stop
- 例:lrange list_key 0 10
- 结果:3 2 1 a b c
7、按照索引获得元素(从左到右)
lindex key index
8、获取列表长度
llen key
9、从左到右删除n个值为value的元素
lrem key n value
10、在value的前面(后面)插入新元素
linsert key before/after value newvalue
11、将key中索引为index的元素替换为value
lset key index value
12、编码方式1
ziplist(压缩列表):当列表中元素个数小于 512(默认)个,并且列表中每个元素的值都小于 64(默认)个字节时,Redis 会选择用 ziplist 来作为列表的内部实现以减少内存的使用。当然上述默认值也可以通过相关参数修改:list-max-ziplist-entried(元素个数)、list-max-ziplist-value(元素值)
13、编码方式2
linkedlist(链表):当列表类型无法满足 ziplist 条件时,Redis 会选择用 linkedlist 作为列表的内部实现
Set(value唯一)
-
set是String类型的无序集合,它的底层是一个value为null的hash表,所以添加、删除、查找复杂度都是O(1)
-
set 的数据结构是字典,字典是由哈希表实现的
1、赋值
sadd key value1 [value2]
- 例:1:sadd test1 a
- 例:2:sadd test2 b c
2、 取出所有值
smembers key
- 例:smembers test2
- 结果:“a” “b” “c”
3、判断key中是否存在该value
sismember key value
4、返回集合中元素个数
scard key
5、删除集合中某个元素
srem key value1 [value2…]
6、随机从集合中取出一个值,且该值被删除
spop key
7、随机从集合中取出n个值,不会从集合中删除
srandmember key n
8、把集合中一个值从一个集合移动到另一个集合,source中的值移除
smove source destination value
9、返回两个集合的交集
sinter key key2
10、返回key1、key2两个集合的交集,并存入新集合destination
sinterstore destination key1 key2
11、返回key1、key2两个集合的并集
sunion key1 key2
12、返回key1、key2两个集合的并集,并存入新集合destination
sunionstore destination key1 key2
13、返回key1、key2两个集合的差集(key1中不包含在key2中的元素)
sdiff key1 key2
14、返回key1、key2两个集合的差集(key1中不包含在key2中的元素),并存入新集合destination
sdiffstore destination key1 key2
15、编码方式1
intset(整数集合):当集合中的元素都是整数,并且集合中的元素个数小于 512 个时,Redis 会选用 intset 作为底层内部实现
16.、编码方式2
hashtable(哈希表):当上述条件不满足时,Redis 会采用 hashtable 作为底层实现
Zset(value唯一)
zset底层使用了两种数据结构:
-
hash:hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过value找到相应的score值。类似于hashmap,hashmap中由field与value;zset 中的member存放在field,保证唯一性,score存放在value中
-
跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
1、赋值
score为对value進行排序的权重
zadd key score member[score member]
- 例:zadd rr 1 a 2 b 0 c 5 e 4 f
2、返回有序集合 key 中,索引在start -stop 之间的元素
zrange key start stop -----> 只返回member
zrange key start stop withscores -----> member 和 score 一起返回
3、返回有序集合 key中,所有score介于min 与max之间的(包括min与max)的成员,并按score由小到大排序
zrangebyscore key min max [withscore] [limit offset count]
- 例1:zrangebyscore rr 0 100 结果:“c” “a” “b” “f” “e”
- 例2:zrange rr 0 100 结果:“c” “a” “b” “f” “e”
4、返回有序集合 key中,所有score介于max与min之间的(包括max与min)的成员,并按score由大到小排序
zrevrangescore key max min [withscore] [limit offset count]
5、为元素的score加上增量
zincrby key increment menber
6、删除集合中的元素
zrem key member
7、统计集合,分数区间内的元素个数
zcount key min max
8、获取key中的成员数
zcard key
8、返回该值在集合中的排名,从0开始
zrank key member
9、编码方式1:
ziplist(压缩列表):当有序集合的元素个数小于 128 个(默认设置),同时每个元素的值都小于 64 字节(默认设置),Redis 会采用 ziplist 作为有序集合的内部实现
10.、 编码方式2
skiplist(跳跃表):当上述条件不满足时,Redis 会采用 skiplist 作为内部编码
Bitmaps
-
bitmaps本身不是一种数据类型,实际上他就是字符串(key-value),但是它可以对字符串的位进行操作
-
bitmaps其实有点类似于数组,不过bitmaps中只能存储 0 和 1 ,偏移量作为索引
如setbit bitmapstest 1 0 setbit bitmapstest 2 1 setbit bitmapstest 3 1 setbit bitmapstest 4 0 setbit bitmapstest 5 0
如下所示:可以把value作为数组中的元素,offset作为数组的索引
1、赋值(返回0表示没有该key-offset-value,赋值成功,1表示已存在该值,赋值失败 )
setbit key offset value
- 例:setbit mybit:20211110 5 1
2、取值
getbit key offset
- 例:getbit mybit:20211110 5
3、获取该key所有value为1的总数
bitcount key [start] [end]
- 例:bitcount mybit:20211110 0 5
4、统计字符串从 start 字节到 end 字节值为1的数量,-1表示最后一个 位,-2表示倒数第二个 位
bitcount key [start end]
5、多个key的交集(and)、并集(or)、非(not)、异或(xor)操作并将结果保存在destkey中
bitop and/or/not/xor destkey key [key…]
- 例:bitop and newkey user1 user2
HyperLogLog
-
HyperLogLog的优点是在输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且是很小的
-
在HyperLogLog中,每个键只需要12KB内存,就可以计算接近2^64个不同元素的基数,而不会存储输入元素本身;所以HyperLogLog不能向集合那样返回输入的各个元素
-
基数:比如数据集{1,3,5,7,5,7,8},那么这个数据集的技术为{1,3,5,7,8},基数(不重复数)为5。基数估计就是在误差可接受范围内,快速计算基数
-
HyperLogLog 不能存在重复值
1、赋值
pfadd key element[element…]
- 例1:pfadd test1 a b c
- 例2:pfadd test2 q w e r
2、取指定key中的元素个数总和
pfcount key [key…]
- 例1:pfcount test1 结果: 3
- 例2:pfcount test2 结果: 4
3、合并key 到newkey(也可以是已存在的key)中
pfmerge destkey sourcekey [sourcekey…]
- 例1:pfmerge test1 test2
- 例2:pfcount test1 结果: 7
- 例3:pfcount test2 结果: 4
GEO
- 提供经纬度设置,查询,范围查询,距离查询,经纬度hash等操作
1、赋值(两极不能添加,已存在的数据不能再添加)
geoadd key longitude latitude member [longitude latitude member …]
- longitude:经度 ,有效范围:-180 到180 度
- latitude:纬度 ,有效范围:-85.05112878 到 85.05112878
- member:地理位置
- 例1:geoadd test1 10.000002086162567 14.999999491308223 shenzhen
- 例2:geoadd test2 10.999999344348907 24.999999152180358 guangzhou
2、取值
geopos key member [member …]
- 例:geopos test1 shenzhen 结果:“10.000002086162567” “14.999999491308223”
3、获取两地间的直线距离
m:米
km:千米
mi:英里
ft:英尺
geodist key member1 member2 [m|km|ft|mi]
- 例:geoadd geotest 10.000002086162567 14.999999491308223 shenzhen 10.999999344348907 24.999999152180358 guangzhou
- 例:geodist geotest shenzhen guangzhou km
- 结果:“1117.1455”
4、范围
根据给定的经纬度为中心获取key的地理位置在某一半径内的元素
georadius key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]
例1:
GEORADIUS geotest 10 15 15 km WITHCOORD
结果:
1) 1) "test1"
2) 1) "10.000002086162567"
2) "14.999999491308223"
2) 1) "test2"
2) 1) "10.000002086162567"
2) "14.999999491308223"
例2:
GEORADIUS geotest 10 15 15 m WITHDIST
结果:
1) 1) "test1"
2) "0.2312"
2) 1) "test2"
2) "0.2312"
例3:
GEORADIUS geotest 10 15 15 km asc
结果:
1) "test2"
2) "test1"
例3:
GEORADIUS geotest 10 15 15 km WITHDIST count 1
获取以经度10,纬度15为中心,15km为半径,获取 geotest 在此半径内的元素
结果:
1) 1) "test2"
2) "0.0002"
- WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
- WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。
- ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。
- WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。 COUNT
- COUNT:传入COUNT参数,可以返回指定数量的结果。
5、 范围
根据给定地理位置获取指定范围内的地理位置集合,与georadius类似
GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD]
[WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]
6、Hash
获取某个地理位置的geohash值
geohash key member [member …]
- 例:geohash geotest shenzhen
三 、其他命令
- 查看当前库中所有 key : key *
- 判断某个 key 是否存在 :exists key
- 查看 key 的类型 :type key
- 删除 key :del key
- 获取key过期时间:ttl key
- 异步删除 key :unlink key
- 设置 key 过期时间 :expire key 10(过期时间10s)
- 查看剩余过期时间 :ttl key(-1表示 永不过期,-2表示已过期)
- 选择数据库 :select 1(选择数据库1)
- 查看当前数据 key 的数量 :dbsize
- 清空当前数据库 :flushdb
- 清空所有数据库 :flushall
- 发布消息:publish key value
- 订阅消息:subscribe key
- 设置值和过期时间:set key value nx ex time