redis 五大数据类型


视频链接
官网: https://redis.io/
中文官网: http://redis.cn/

文章地址
redis入门https://blog.csdn.net/qq_41538097/article/details/118097179
五大数据类型https://blog.csdn.net/qq_41538097/article/details/118123867
三种特殊数据类型https://blog.csdn.net/qq_41538097/article/details/118160898
Redis 事务,watch 监控(乐观锁)https://blog.csdn.net/qq_41538097/article/details/118198672
springboot 整合 redis https://blog.csdn.net/qq_41538097/article/details/118199634
RedisUtil 工具类https://blog.csdn.net/qq_41538097/article/details/118331927
Redis.conf 配置详解https://blog.csdn.net/qq_41538097/article/details/118334331
redis 持久化操作https://blog.csdn.net/qq_41538097/article/details/118340130
redis 发布订阅https://blog.csdn.net/qq_41538097/article/details/118348000
redis 主从复制https://blog.csdn.net/qq_41538097/article/details/118354527
redis 哨兵模式https://blog.csdn.net/qq_41538097/article/details/118360381
一、Redis-Key
127.0.0.1:6379> set name ye
OK
127.0.0.1:6379> set age 18
127.0.0.1:6379> get agger # 没有该 key ,返回 (nil)
(nil)
127.0.0.1:6379> exists name # 判断键是否存在
(integer) 1
127.0.0.1:6379> move name 1 # 移动 name 到 1号库,当前是0号库 
(integer) 1
127.0.0.1:6379> keys *
# 设置 address的过期时间为 10秒(单位是秒不是毫秒),如果不设置过期时间默认永不过期,ttl 查看 值为 -1,当 ttl 查看为 -2 ,便是该数据已过期 
127.0.0.1:6379> expire aggress 10
(integer) 1
127.0.0.1:6379> ttl address # 查询 address  的剩余过期时间
(integer) 7
127.0.0.1:6379> ttl address
(integer) -2 # 已过期
127.0.0.1:6379> ttl age 
(integer) -1 # 永不过期
127.0.0.1:6379> del age # 删除 age 
(integer) 1
127.0.0.1:6379> type name  # set name ye
string
127.0.0.1:6379> type age  #  set age 18
string
二、String
127.0.0.1:6379> clear
127.0.0.1:6379> get name
"ye"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> append name ling # 追加值,返回长度
(integer) 6
127.0.0.1:6379> get name
"yeling"
127.0.0.1:6379> strlen name # 获取长度
(integer) 6
127.0.0.1:6379> append age 25 # 如果该键不存在,则相当于 set age 25
(integer) 2
127.0.0.1:6379> get age
"25"
#############################################
# 自增
127.0.0.1:6379> set views 0 # 初始浏览量0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 自增 1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views # 自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> incrby views 10 # 自增10 (步长为10)
(integer) 9
127.0.0.1:6379> incrby views 10
(integer) 19
127.0.0.1:6379> decrby views 10 # 自减 10 (步长为10)
(integer) 9
127.0.0.1:6379> decrby views 10
(integer) -1
127.0.0.1:6379> get views
"-1"
#############################################
# 截取字符串
127.0.0.1:6379> set name hello,ye
OK
127.0.0.1:6379> get name
"hello,ye"
127.0.0.1:6379> getrange name 0 3  # 截取字符串 【0,3】
"hell"
127.0.0.1:6379> getrange name 0 -1 # 获取全部字符串和 get key 相同
"hello,ye"
#############################################
# 替换字符串
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xxxx # 替换指定位置的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxxxfg"
127.0.0.1:6379> setrange key2 1 222222222222 # 超出原本字符串长度会正常替换
(integer) 13
127.0.0.1:6379> get key2
"a222222222222"
############################################
# setex (set with expire) 设置过期时间
# setnx (set if no exists )不存在设置(在分布锁常用)
127.0.0.1:6379> setex key3 30 hello # 添加或修改 key 并设置 30 秒过期,expire key 10,给已存在的 key 添加过期时间
OK
127.0.0.1:6379> ttl key3
(integer) 17
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey redis # 如果 mykey 不存在则添加并设置值为 redis
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "name"
3) "mykey"
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> ttl mykey
(integer) -1
127.0.0.1:6379> setnx mykey mongodb # 如果 key 存在,创建失败
(integer) 0
127.0.0.1:6379> get  mykey
"redis"
############################################
# mset 批量添加 msetnx 批量,如果已存在则失败,原子性
# mget 批量获取 
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"
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 # msetnx 原子性操作,要么成功,要么失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
##########################################
# 对象存储,可以已 json 字符串存储或者将对象每个属性作为一个键
127.0.0.1:6379> set student "{name:'ye',age:18,address:'xian'}"
OK
127.0.0.1:6379> get student
"{name:'ye',age:18,address:'xian'}"
127.0.0.1:6379> mset student:name ye student:age 18 student:address xian
OK
127.0.0.1:6379> mget student:name student:age student:address
1) "ye"
2) "18"
3) "xian"
############################################
# getset 先 get 获取值,再 set设置值
127.0.0.1:6379> getset db redis  # 如果值不存在返回 (nil)
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb # 如果值存在,获取原来的值设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
三、List

基本的数据类型:列表、栈、队列、阻塞队列,可以重复
在这里插入图片描述

##############################################################
# lpush  从列表左侧插入
# rpush  从列表右侧插入
127.0.0.1:6379> lpush dog tom jany jack # 将一个或多个插入列表左侧
(integer) 3
127.0.0.1:6379> lpush dog sanny
(integer) 4
127.0.0.1:6379> lrange dog 0 -1 #  获取全部数据
1) "sanny"
2) "jack"
3) "jany"
4) "tom"
127.0.0.1:6379> lrange dog 0 2 # 获取【0,2】数据
1) "sanny"
2) "jack"
3) "jany"
127.0.0.1:6379> rpush dog honry # 将一个或多个插入列表左侧
(integer) 5
127.0.0.1:6379> lrange dog 0 -1 
1) "sanny"
2) "jack"
3) "jany"
4) "tom"
5) "honry"
########################################################
# lpop 左边弹出(移除某个值)
# rpop 右边弹出(移除某个值)
127.0.0.1:6379> lpop dog 1
1) "sanny"
127.0.0.1:6379> lrange dog 0 -1
1) "jack"
2) "jany"
3) "tom"
4) "honry"
127.0.0.1:6379> rpop dog 2 # rpop dog 不指定参数默认为 1
1) "honry"
2) "tom"
127.0.0.1:6379> lrange dog 0 -1
1) "jack"
2) "jany"
#############################################################
# lindex 获取list某个具体的值,没有 rindex
127.0.0.1:6379> lrange dog 0 -1
1) "jack"
2) "jany"
127.0.0.1:6379> lindex dog 0
"jack"
127.0.0.1:6379> lindex dog 1
"jany"
#############################################################
# llen 获取数组长度
127.0.0.1:6379> lpush dog Tonney
(integer) 1
127.0.0.1:6379> rpush dog tom
(integer) 2
127.0.0.1:6379> llen dog
(integer) 2
#############################################################
# lrem 移除数组值,从左侧开始查找
127.0.0.1:6379> lrange dog 0 -1
1) "tom" 2) "Tonney" 3) "tom"
127.0.0.1:6379> lrem dog 1 tom # 移除一个
(integer) 1
127.0.0.1:6379> lrange dog 0 -1
1) "Tonney" 2) "tom"
127.0.0.1:6379> lpush dog tom
(integer) 3
127.0.0.1:6379> lrange dog 0 -1
1) "tom" 2) "Tonney" 3) "tom"
127.0.0.1:6379> lrem dog 2 tom # 移除两个
(integer) 2
127.0.0.1:6379> lrange dog 0 -1
1) "Tonney"
#############################################################
# trim 截取指定长度
127.0.0.1:6379> rpush mylist hello1
(integer) 1
127.0.0.1:6379> rpush mylist hello2
(integer) 2
127.0.0.1:6379> rpush mylist hello3
(integer) 3
127.0.0.1:6379> ltrim mylist 1 2 # 截取从 1 开始,截取 2 位
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello2"
2) "hello3"
#############################################################
`rpoplpush 从数组 A 弹出右侧一个值,添加到 数组 B 最左侧` 
127.0.0.1:6379> lrange dog 0 -1
1) "tom" 2) "tonney"
127.0.0.1:6379> rpoplpush dog cat # 将 dog 最右侧 "tonney" 添加到新数组 cat 最左侧
"tonney"
127.0.0.1:6379> lrange dog 0 -1
1) "tom"
127.0.0.1:6379> lrange cat 0 -1
1) "tonney"
127.0.0.1:6379> rpush dog jacke
(integer) 2
127.0.0.1:6379> lrange dog 0 -1
1) "tom" 2) "jacke"
127.0.0.1:6379> rpoplpush dog dog # 将 dog 最右侧 "jacke" 添加到 dog 数组最左侧
"jacke"
127.0.0.1:6379> lrange dog 0 -1
1) "jacke" 2) "tom"

#############################################################
`lset 根据下标更新值,如果该下标不存在更新会报错`
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item # 修改下标为 0 的值为 item
OK
127.0.0.1:6379> lset list 1 oppo # 修改不存在的下标报错
(error) ERR index out of range

#############################################################
`linsert 将某个具体的 value 插入到某个元素的前面后面` 
127.0.0.1:6379> rpush list hello
(integer) 1
127.0.0.1:6379> rpush list world
(integer) 2
127.0.0.1:6379> linsert list before world other # 将 other 值添加到 list 数组的 world 元素前面
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello" 2) "other"  3) "world"
127.0.0.1:6379> linsert list after world new # 将 new 值添加到 list 数组的 world 元素后面
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hello" 2) "other" 3) "world" 4) "new"

小结:

  • ·他实际上是一个链表,before Node after , left , right 都可以插入值·
  • 如果key不存在,创建新的链表,如果key存在,新增内容
  • 如果移除了所有值,空链表,也代表不存在!
  • 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点

消息排队!消息队列*(Lpush Rpop ) ,栈(Lpush Lpop )

四、 Set ( 集合 )

set 中的值不能重复

##########################################
`sadd 给 set 集合添加数据` 
`smembers 获取 set 集合的所有值`
`sismember 判断 set 集合是否包含该值`
127.0.0.1:6379> sadd myset hello  # 添加 hello 到 myset 集合 
(integer) 1
127.0.0.1:6379> sadd myset world love # 一次添加多个
(integer) 2
127.0.0.1:6379> smembers myset # 查看所有值
1) "hello" 2) "world" 3) "love"
127.0.0.1:6379> sismember myset kuang # 查询是否包含 kuang 值---不包含
(integer) 0
127.0.0.1:6379> sismember myset hello # 查询是否包含 hello 值---包含
(integer) 1

##########################################
`scard 获取 set 集合长度`
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> sadd myset hello # set 集合不能重复,重复添加会失败
(integer) 0
127.0.0.1:6379> sadd myset kuang 
(integer) 1
127.0.0.1:6379> scard myset
(integer) 4

##########################################
`srem 移除 set 集合中的某个值`
127.0.0.1:6379> smembers myset
1) "kuang" 2) "hello" 3) "world" 4) "love"
127.0.0.1:6379> srem myset kuang
(integer) 1
127.0.0.1:6379> smembers myset
1) "hello" 2) "world" 3) "love"
127.0.0.1:6379> scard myset
(integer) 3

##########################################
`srandmember 随机 set 集合中的值(常用抽奖随机)`
127.0.0.1:6379> smembers myset
1) "hello" 2) "world" 3) "love"
127.0.0.1:6379> srandmember myset
"world"
127.0.0.1:6379> srandmember myset
"hello"
127.0.0.1:6379> srandmember myset 2
1) "world" 2) "love"
127.0.0.1:6379> srandmember myset 2
1) "hello" 2) "world"

##########################################
`spop 随机弹出(删除) set 集合中的值`
127.0.0.1:6379> smembers myset
1) "ye" 2) "hello" 3) "world" 4) "love" 5) "tom"
127.0.0.1:6379> spop myset # 随机弹出一个
"love"
127.0.0.1:6379> spop myset 2 # 随机弹出两个
1) "tom" 2) "hello"
127.0.0.1:6379> smembers myset
1) "ye" 2) "world"

##########################################
`将 set2 的值移动到 set1 集合`
127.0.0.1:6379> sadd set1 hello
(integer) 1
127.0.0.1:6379> sadd set1 world
(integer) 1
127.0.0.1:6379> sadd set2 ye
(integer) 1
127.0.0.1:6379> smove set2 set1 ye # 将 set2 的值 ye 移动到 set1 中 
(integer) 1
127.0.0.1:6379> smembers set1
1) "ye" 2) "hello" 3) "world"
127.0.0.1:6379> smembers set2
(empty array)

##########################################
`微博 、B 站 共同关注 、差集-并集-交集`
127.0.0.1:6379> sadd key1 a b c d
(integer) 4
127.0.0.1:6379> sadd key2 c d e
(integer) 3
127.0.0.1:6379> sdiff key1 key2 # 差集:key1 不同于 key2 的值
1) "a" 2) "b"
127.0.0.1:6379> sdiff key2 key1 # 差集:key2 不同于 key1 的值
1) "e"
127.0.0.1:6379> sinter key1 key2 # 交集:key1 和 key2 相同的值
1) "c" 2) "d"
127.0.0.1:6379> sunion key1 key2 # 并集:key1 和 key2 合并去重
1) "b" 2) "d" 3) "c" 4) "a" 5) "e"

适用场景:微博,A、B 用户将所有关注的人分别放在一个 set 集合中!将他的粉丝也分别放在一个集合中
共同关注,共同好友(可以使用 sinter A B 获取共同关注,共同粉丝)

五、Hash(哈希)

Map 集合,key-value (value 又是一个 map ),功能类似 String ,只是将原本多个String 的 key 和 value 存入一个 hash 集合中

####################################################
`hset 添加一个或多个键值对,作用和 hmset 相同,hgetall 查询所有 key 和 value`
127.0.0.1:6379> hset myhash name ye # 添加一个
(integer) 1

127.0.0.1:6379> hset myhash name ling # key 存在则为修改
(integer) 0
127.0.0.1:6379> hget myhash name
"ling"
127.0.0.1:6379> hsetnx myhash name yun # key 不存在新增
(integer) 0
127.0.0.1:6379> hget myhash name
"ling"


127.0.0.1:6379> hset myhash age 18 address xian # 添加多个
(integer) 2
127.0.0.1:6379> hget myhash age # 获取一个
"18"
127.0.0.1:6379> hmset myhash phone 111 sex man # 添加多个
OK
127.0.0.1:6379> hmget myhash name age address phone sex  # 获取多个value值
1) "ye" 2) "18" 3) "xian" 4) "111" 5) "man"
127.0.0.1:6379> hgetall myhash # 获取所有的 key 键和 value 值
 1) "name" 2) "ye" 3) "age" 4) "18"  5) "address" 6) "xian"  7) "phone" 8) "111" 9) "sex" 10) "man"
 
####################################################
 `hdel 删除 key-value,可以删除多个`
127.0.0.1:6379> hdel myhash address sex  phone
(integer) 3
127.0.0.1:6379> hgetall myhash
1) "name" 2) "ling" 3) "age" 4) "18"

####################################################
 `hlen 获取 hash 的长度`
127.0.0.1:6379> hgetall myhash
1) "name" 2) "ling" 3) "age" 4) "18"
127.0.0.1:6379> hkeys myhash # 获取所有 key
1) "name" 2) "age"
127.0.0.1:6379> hlen myhash
(integer) 2

####################################################
`hexists 判断 key 是否存在`
127.0.0.1:6379> hkeys myhash
1) "name" 2) "age"
127.0.0.1:6379> hexists myhash name
(integer) 1
127.0.0.1:6379> hexists myhash sex
(integer) 0

####################################################
`hkeys 获取所有的 key`
`hvals 获取所有的 value`
`hgetall 获取所有的 key、value 集合`
127.0.0.1:6379> hkeys myhash
1) "name" 2) "age"
127.0.0.1:6379> hvals myhash
1) "ling" 2) "18"
127.0.0.1:6379> hgetall myhash 
1) "name" 2) "ling" 3) "age" 4) "18"

####################################################
`hincrby 增量(正数负数都可以)`
`hsetnx 如果不存在添加,如果存在报错`
127.0.0.1:6379> hgetall myhash 
1) "name" 2) "ling" 3) "age" 4) "18"
127.0.0.1:6379> hincrby myhash age 3 # 增量 3
(integer) 21
127.0.0.1:6379> hget myhash age
"21"
127.0.0.1:6379> hincrby myhash age -2 # 增量 -2
(integer) 19
127.0.0.1:6379> hget myhash age
"19"
127.0.0.1:6379> hsetnx myhash sex man # myhash 中不存在 sex,添加成功
(integer) 1
127.0.0.1:6379> hsetnx myhash sex women # 已存在,添加失败
(integer) 0

适用场景:
hash 变更的数据 user,name,age 尤其是用户信息类,经常变动的信息! hash 更适合对象的存储,String 更适合 存储字符串

六、Zset(有序集合)

Zset k1 score1 v1 相比 Set k1 v1 增加了一个 score1

####################################################
`zadd 添加数据,zrange 获取数据`
127.0.0.1:6379> zadd myset 1 one # 添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three # 添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1 # 自带排序从小到大
1) "one" 2) "two" 3) "three"

####################################################
`ZRANGEBYSCORE 升序 set 集合`
`200 5000 这个是范围,表示 [200,5000](200 50000 表示 (200,5000],需要排序那些数据,就把范围设多大,排序所有就设置 -∞ +∞`
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # -inf: -∞    +inf : +∞ withscores 打印 scores
1) "ye" 2) "200"
3) "zhangsan" 4) "5000"
5) "xiaohong" 6) "9999"
127.0.0.1:6379> ZRANGEBYSCORE salary 200 5000 # 显示 200 <= score <= 5000 的值
1) "ye"
2) "zhangsan"
127.0.0.1:6379> ZRANGEBYSCORE salary (200 5000 # 显示 200 < score <= 5000 的值
1) "zhangsan"

####################################################
`ZREVRANGE 反转(降序) set 集合,不能设置选取排序的范围`
127.0.0.1:6379> zrange salary 0 -1 # 查询全部,自带排序从小到大
1) "ye"
2) "zhangsan"
3) "xiaohong"
127.0.0.1:6379> ZREVRANGE salary 0 -1 # 查询全部,从大到小排序
1) "xiaohong"
2) "zhangsan"
3) "ye"
127.0.0.1:6379> ZREVRANGE salary 0 5 # 查询 0~5 条数据,从大到小排序
1) "xiaohong"
2) "zhangsan"
3) "ye"

####################################################
`zrem 删除 set 集合元素`
127.0.0.1:6379> zrem salary xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "ye"
2) "zhangsan"

####################################################
`获取指定区间元素数量`
127.0.0.1:6379> zadd myset 1 one 
(integer) 1
127.0.0.1:6379>  zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> zcount myset 0 2  # 【0,2】之间有两个
(integer) 2
127.0.0.1:6379> zcount myset 0 (2  #【0,2) 之间有一个
(integer) 1

适用场景:

  • set 排序,班级成绩表,员工工资表
  • 普通消息 1;重要消息 2;带权重进行判断
  • 排行榜应用实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值