2.Redis10大数据类型
2.Redis10大数据类型
Redis Key(键)操作命令
命令 | 含义 |
---|---|
keys* | 查询当前库所有的key |
exists key | 判断某个key是否存在(1:true 0:false) |
type key | 查看key的类型 |
del key | 删除指定的key数据 (1:true 0:false) |
unlink key | 非阻塞删除,仅仅将keys从kepspace元数据中删除,真正的删除会在后续异步中操作 |
ttl key | 查看还有多少秒过期,-1永远不过期,-2表示已过期 |
expire key | 给指定的key设置过期时间 |
move key dbindex [0-15] | 将当前数据的key移动到指定的数据库db当中 |
select dbindex | 切换数据库[0-15] 默认为0 |
dbsize | 查看当前数据库key的数量 |
flushdb | 清空当前数据库 |
flushall | 清除所有数据库 |
命令不区分大小写,但是key区分大小写
1.redis字符串 (String)
String(字符串)
String是redis最基本的类型,一个key对应一个value(单值单value)
String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化对象。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
案例:
最常用:
set key value / get key
127.0.0.1:6379> set k1 helloworld
OK
127.0.0.1:6379> get k1
"helloworld"
set k1 v1 get 第一次返回旧值 在get返回新值
127.0.0.1:6379> set k1 v1 get
"helloworld"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
同时设置/获取多个键值:
1.mset key value
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
2.mget key
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
3.mset/mget/msetnx
注意!msetnx 当前key(整体)不存在才会建立成功 即:同时不存在key 设立成功 只要有一个存在 就不会创建成功
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4
(integer) 0
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> msetnx k5 v5 k6 v6
(integer) 1
127.0.0.1:6379> get k5
"v5"
127.0.0.1:6379> get k6
"v6"
获取指定区间范围内的值:
setrange/getrange
getrange:类似于java的substring 只不过redis的范围是闭区间 java是左闭右开区间
127.0.0.1:6379> set k1 abcd1234
OK
127.0.0.1:6379> GETRANGE k1 0 -1
"abcd1234"
127.0.0.1:6379> GETRANGE k1 0 3
"abcd"
127.0.0.1:6379> SETRANGE k1 1 xxyy
(integer) 8
127.0.0.1:6379> get k1
"axxyy234"
数值增减:
一定是数字才能加减!!!
命令 | 含义 |
---|---|
INCR KEY | 数字递增 |
INCRBY key increment | 增加指定的整数 |
DECR key | 数字递减 |
DECRBY key decrement | 减去指定的整数 |
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> INCR k1
(integer) 2
127.0.0.1:6379> get k1
"2"
127.0.0.1:6379> incr k1
(integer) 3
127.0.0.1:6379> get k1
"3"
127.0.0.1:6379> INCRBY k1 10
(integer) 13
127.0.0.1:6379> get k1
"13"
127.0.0.1:6379> DECR k1
(integer) 12
127.0.0.1:6379> get k1
"12"
127.0.0.1:6379> DECR k1
(integer) 11
127.0.0.1:6379> get k1
"11"
127.0.0.1:6379> DECRBY k1 10
(integer) 1
127.0.0.1:6379> get k1
"1"
127.0.0.1:6379>
获取字符串长度和内容追加:
STRLEN key / APPEND key value
127.0.0.1:6379> set k1 abcd
OK
127.0.0.1:6379> STRLEN k1
(integer) 4
127.0.0.1:6379> APPEND k1 xxxx
(integer) 8
127.0.0.1:6379> get k1
"abcdxxxx"
127.0.0.1:6379>
分布式锁:
setnx(set if not exist) key value
setex(set with expire)键单位:秒
127.0.0.1:6379> SETEX k1 10 v11
OK
127.0.0.1:6379> ttl k1
(integer) 6
127.0.0.1:6379> setnx k1 v11
(integer) 0
127.0.0.1:6379>
getset:(先get再set)
先get出来旧值 再set设置get新值
127.0.0.1:6379> GETSET k1 haha
"v11"
127.0.0.1:6379> get k1
"haha"
127.0.0.1:6379>
应用场景:
例如抖音无限点赞某个视频或者商品,点一下增加一次
是否喜欢的文章
2.redis列表 (List)
List(列表)
Redis列表是简单的字符串列表,,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际上是个双端列表,最多可以包含2^32-1个元素(4294967295,每个列表超过40亿个元素)
主要功能由push/pop等,一般用在栈、队列、消息队列等场景。
left、right都可以插入添加
- 如果键不存在,创建新的链表;
- 如果键已存在,新增内容;
- 如果值全移除,对应的键也就消失了。
案例:
左边添加/右边添加/从左边开始遍历
lpush/rpush/lrange
lpush:进来顺序==出去顺序逆序
rpush:进来顺序==出去顺序
127.0.0.1:6379> LPUSH list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> RPUSH list2 11 22 33 44 55
(integer) 5
127.0.0.1:6379> LRANGE list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "127.0.0.1:6379> LRANGE list2 0 -1
1) "11"
2) "22"
3) "33"
4) "44"
5) "55"
lpop/rpop
127.0.0.1:6379> LPOP list1
"5"
127.0.0.1:6379> RPOP list1
"1"
127.0.0.1:6379> LRANGE list1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379>
按照索引下标获得元素(从上到下)
lindex
127.0.0.1:6379> LINDEX list2 0
"11"
127.0.0.1:6379> LINDEX list2 5
(nil)
127.0.0.1:6379> LINDEX list2 4
"55"
127.0.0.1:6379>
获取列表中元素个数
127.0.0.1:6379> llen list2
(integer) 5
删除N个值等于v1的元素
lrem key
127.0.0.1:6379> LPUSH list3 v1 v1 v1 v2 v2 v3 v3 v3
(integer) 8
127.0.0.1:6379> LREM list3 2 v1
(integer) 2
127.0.0.1:6379> LRANGE list3 0 -1
1) "v3"
2) "v3"
3) "v3"
4) "v2"
5) "v2"
6) "v1"
127.0.0.1:6379>
截取指定范围的值后重新赋值给key
ltrim key 全闭区间(类似substring)
127.0.0.1:6379> LRANGE list3 0 -1
1) "v3"
2) "v3"
3) "v3"
4) "v2"
5) "v2"
6) "v1"
127.0.0.1:6379> LTRIM list3 0 3
OK
127.0.0.1:6379> LRANGE list3 0 -1
1) "v3"
2) "v3"
3) "v3"
4) "v2"
127.0.0.1:6379>
源列表 目的列表
rpoplpush
移除列表最后一个元素,并将该元素添加到另一个列表返回
源列表:rpop
目的列表:lpush
127.0.0.1:6379> LRANGE list1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> LRANGE list2 0 -1
1) "11"
2) "22"
3) "33"
4) "44"
5) "55"
127.0.0.1:6379> RPOPLPUSH list1 list2
"2"
127.0.0.1:6379> LRANGE list1 0 -1
1) "4"
2) "3"
127.0.0.1:6379> LRANGE list2 0 -1
1) "2"
2) "11"
3) "22"
4) "33"
5) "44"
6) "55"
127.0.0.1:6379>
给下标为index重新赋值
lset key index value
127.0.0.1:6379> LRANGE list2 0 -1
1) "2"
2) "11"
3) "22"
4) "33"
5) "44"
6) "55"
127.0.0.1:6379> LSET list2 0 00
OK
127.0.0.1:6379> LRANGE list2 0 -1
1) "00"
2) "11"
3) "22"
4) "33"
5) "44"
6) "55"
127.0.0.1:6379>
已经有值插入的新值
linsert key before/after
127.0.0.1:6379> LINSERT list2 before 55 new
(integer) 7
127.0.0.1:6379> LRANGE list2 0 -1
1) "00"
2) "11"
3) "22"
4) "33"
5) "44"
6) "new"
7) "55"
127.0.0.1:6379>
应用场景:
公众号订阅消息
3.redis哈希表 (Hash)
Redis hash是一个String类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。
Redis中每个hash可以存储2^32-1键值对(40多亿)
KV模式不变,但是V是一个键值对。(即:Map< String >,Map<Object,Object>)
案例:
hset/hget/hmest/hmget/hgetall/hdel
127.0.0.1:6379> HSET user:001 id 11 name z3 age 25
(integer) 3
127.0.0.1:6379> hget user:001 id
"11"
127.0.0.1:6379> hget user:001 name
"z3"
<!----------------->
127.0.0.1:6379> hmset user:001 id 12 name L4 age 26
OK
127.0.0.1:6379> HMGET user:001 id name age
1) "12"
2) "L4"
3) "26"
<!----------------->
127.0.0.1:6379> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "L4"
5) "age"
6) "26"
<!----------------->
127.0.0.1:6379> hdel user:001 age
(integer) 1
127.0.0.1:6379> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "L4"
获取某个key的全部数量
hlen
127.0.0.1:6379> HLEN user:001
(integer) 2
127.0.0.1:6379> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "L4"
127.0.0.1:6379>
在key里面的某个值的key
hexists key(简单说就是判断这个field存不存在)
127.0.0.1:6379> HEXISTS user:001 name
(integer) 1
127.0.0.1:6379> HEXISTS user:001 sex
(integer) 0
hkeys/hvals
hkeys:获取所有的key
hvals:获取所有的value
127.0.0.1:6379> HKEYS user:001
1) "id"
2) "name"
127.0.0.1:6379> HVALS user:001
1) "12"
2) "L4"
127.0.0.1:6379>
hincrby/hincrfloat
hincrby:整数增加
hincrfloat:浮点数增加
127.0.0.1:6379> HSET user:001 age 25 score 99.5
(integer) 2
127.0.0.1:6379> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "L4"
5) "age"
6) "25"
7) "score"
8) "99.5"
127.0.0.1:6379> HINCRBY user:001 age 2
(integer) 27
127.0.0.1:6379> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "L4"
5) "age"
6) "27"
7) "score"
8) "99.5"
127.0.0.1:6379> HINCRBYFLOAT user:001 score 100
"199.5"
127.0.0.1:6379> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "L4"
5) "age"
6) "27"
7) "score"
8) "199.5"
127.0.0.1:6379>
hsetnx
不存在则赋值,存在了则无效。
127.0.0.1:6379> HSETNX user:001 email 128@qq.com
(integer) 1
127.0.0.1:6379> HSETNX user:001 email 12@qq
(integer) 0
127.0.0.1:6379>
应用场景:
迷你的电商系统会采用
4.redis集合 (Set)
Set(集合)
Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是intset或者hashtable
Redis中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为最多可以包含2^32-1(4294967295,每个集合可存储40亿个成员)
案例:
添加元素
sadd set member
127.0.0.1:6379> SADD set1 1 1 1 2 2 2 3 4 5
(integer) 5
遍历集合
smembers set
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
判断元素是否在集合中
sismember set member
127.0.0.1:6379> SISMEMBER set1 x
(integer) 0
127.0.0.1:6379> SISMEMBER set1 2
(integer) 1
127.0.0.1:6379>
删除元素
srem set member
127.0.0.1:6379> SREM set1 1
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379>
获取元素个数
scard set
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> SCARD set1
(integer) 4
从集合中随机展现设置的数字个数元素,元素不删除
srandmember key[x]
从集合中随机选取x个元素
127.0.0.1:6379> SRANDMEMBER set1 2
1) "2"
2) "3"
127.0.0.1:6379> SRANDMEMBER set1 2
1) "5"
2) "4"
127.0.0.1:6379>
从集合中随机弹出一个元素,并且删除
spop key[数字]
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> spop set1 2
1) "4"
2) "3"
127.0.0.1:6379> spop set1 1
1) "5"
127.0.0.1:6379> SMEMBERS set1
1) "2"
127.0.0.1:6379>
在key1里已存在的某个值,将key1存在的值迁移给key2
smove key1 key2
就是把key1的某个元素给key2。此时key1删除这个元素,key2添加这个元素
127.0.0.1:6379> sadd set2 a b c
(integer) 3
127.0.0.1:6379> SMOVE set1 set2 2
(integer) 1
127.0.0.1:6379> SMEMBERS set1
(empty array)
127.0.0.1:6379> SMEMBERS set2
1) "b"
2) "2"
3) "c"
4) "a"
127.0.0.1:6379>
集合运算(交、并、差)
Tep1:A-B (属于A但不属于B的集合)
sdiff key[key…]
127.0.0.1:6379> SADD A a b c 1 2
(integer) 5
127.0.0.1:6379> SADD B 1 2 3 a x
(integer) 5
127.0.0.1:6379> SDIFF A B
1) "b"
2) "c"
127.0.0.1:6379> SDIFF B A
1) "x"
2) "3"
127.0.0.1:6379>
Tep2:A∪B
sunion key[key…]
127.0.0.1:6379> SUNION A B
1) "x"
2) "b"
3) "1"
4) "2"
5) "3"
6) "a"
7) "c"
127.0.0.1:6379>
Tep3:A∩B
sinter key[key…]
127.0.0.1:6379> SINTER A B
1) "1"
2) "2"
3) "a"
127.0.0.1:6379>
sintercard x key[key…]
x:集合个数 假设两个A和B
不返回结果,只返回交集的个数
127.0.0.1:6379> SINTERCARD 2 A B
(integer) 3
127.0.0.1:6379>
应用场景:
1.微信抽奖小程序
2.朋友圈点赞查看同赞朋友
3.QQ推送你可能认识的人
…
5.redis有序集合 (ZSet/Sorted set)
zset(sorted set:有序集合)
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的对象,redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zset是通过哈希表实现的,所以添加,删除,查找的复杂度是O(1)。集合中最大成员数为2^32-1
案例:
向有序集合添加一个元素和该元素的分数
127.0.0.1:6379> ZADD zset1 60 v1 70 v2 80 v3 90 v4 100 v5
(integer) 5
获取元素(从小到大)
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379> ZRANGE zset1 0 -1 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
9) "v5"
10) "100"
获取元素(从大到小)
127.0.0.1:6379> ZREVRANGE zset1 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> ZREVRANGE zset1 0 -1 withscores
1) "v5"
2) "100"
3) "v4"
4) "90"
5) "v3"
6) "80"
7) "v2"
8) "70"
9) "v1"
10) "60"
按照分数范围取值
127.0.0.1:6379> ZRANGEBYSCORE zset1 60 90
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379>
获取元素分数
127.0.0.1:6379> ZSCORE zset1 v1
"60"
127.0.0.1:6379>
获取元素个数
127.0.0.1:6379> ZCARD zset1
(integer) 5
127.0.0.1:6379>
删除元素
127.0.0.1:6379> ZREM zset1 v5
(integer) 1
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379>
获取指定分数范围内的元素个数
127.0.0.1:6379> ZRANGE zset1 0 -1 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
127.0.0.1:6379> ZCOUNT zset1 60 80
(integer) 3
127.0.0.1:6379> ZCOUNT zset1 70 100
(integer) 3
127.0.0.1:6379>
获取元素下标(顺序)
127.0.0.1:6379> ZRANGE zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> ZRANK zset1 v2
(integer) 1
获取元素下标(逆序)
127.0.0.1:6379> ZREVRANGE zset1 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> ZREVRANK zset1 v2
(integer) 2
应用场景:
根据商品销售堆商品进行排序显示
6.redis地理空间 (GEO)
Redis GEO主要用于存储地理位置信息,并对存储的信息进行操作,包括
添加地理位置的坐标
获取地理位置的坐标
计算两个位置之间的距离
根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
7.redis基数统计 (HyperLogLog)
HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
8.redis位图 (bitmap)
一个字节(一个byte)=8位
0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
---|
上面由许许多多的小格子组成,每一个格子里面只能放1或者0,用它来判断Y/N状态,简单来说就是每一个小格子就是一个个bit
由0和1状态表现的二进制位的bit数组
9.redis位域 (bitfield)
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。
说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
10.redis流 (Stream)
Redis Stream 是Redis 5.0版本新增加的数据结构。
Redis Stream主要用于消息队列(MQ,Message Queue),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能(它想干掉Rabbit MQ和kafka。 但是专业的事情还是交给专业的人做),但它有个简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。
而Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!