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

案例:
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 [email protected]
(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提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

你可能感兴趣的:(Redis,数据库,redis)