五大数据类型 才基本语法,到应用场景描述
常用Redis-key 语法
-
expire name 10 #设置key过期时间(过期就null,单位:秒)
-
ttl name #查询当前key剩余时间
-
exists name #key是否存在
-
move name #移除当前key
-
type name #返回key类型
1 String(字符串)
-
最大内存—-512M
-
string是以一种纯字符串作为value的形式存在的。也是这几种之中使用最多的数据结构。value可以存储json格式、数值型等。
1.1 基本
- set name llt
- get name
1.2 追加
语法:append key value
- append name hello #在key后面添加(如不存在,则新建key)
1.3 删除
语法:del key [key …]
- del name
1.4 长度
语法:strlen key
1.5 自增自减
- incr views #自增 i++ increment
- decr views #自减 i– decrement
- incrBy views 8 # i+=8 步长
- decrBy views 5 # i-=5
- incrbyfloat views 12.3 #double
1.6 截取
语法:getRange key start end
- getRange name 5 8 #截取字符串 [star,end] 类似subString
- getRange name 0 -1 #获取全部字符串与get相同
1.7 替换
语法:setRange key offset value
- setRange name 1 xx #从第2位置开始替换2个位置
1.8 条件
语法:setEx key seconds value 设置过期时间set with expire
毫秒:psetEx key milliseconds value
语法:setNx key value 不存在才能设置成功set if no exist
- setex name 15 llt #设置key值为value,过期时间second
- setnx name LLT #如key不存在,才能设置成功
0表示失败,1表示成功
- ttl name #查询剩余时间
1.9 批量
语法:mset key value [key value …]
语法:mget key [key …]
- mset k1 v1 k2 v2 k3 v3 #同时设置多个值
- mget k1 k2 k3 #同时获取多个值
- msetnx k1 v1 k4 v4 #msetnx是一个原子性操作,要么一起成功,要么一起失败 &&并关系
1.10 getset
语法:getset key value 先get然后在set
- getset db llt #如果不存在值,则返回null
- getset db aaa #如果存在值,获取原来的值,并设置新的值
1.11 对象 应用
这里key是一个巧妙的设计:user:{id}:{filed}
- mset user:1:name llt user:1:age 2
- mget user:1:name user:1:age
1.12 应用场景
-
缓存功能:部分数据第一查询数据库,查询完后存入redis中,后续在获取可以从redis中获取
-
对象缓存:
1)set存储用户信息,key=user:id,value=json格式数据
2)mset批量存储用户信息,适用于数据不断变化的应用场景
(如:用户微信余额,存取方便,效率高)
-
分布式锁
适用场景:在一个集群环境下 ,多个web应用时对同一个商品进行抢购和减库存操作时,可能出现超卖时,会用到分布式锁(setNX命令)(set if not exists)
setNX product:id true #返回1表示获取成功 setNX product:id false #返回0表示获取失败 ...执行业务操作 del product:id #执行业务释放锁 set product:id true ex 10 nx #防止程序意外终止导致死锁
-
验证码:key=手机号,value=验证码,同时设置过期时间
-
计数器:评论数,点赞数,收藏数,评价数,销量,访问量,阅读量(一段时间后同步到mysql中)
incr article:readcount:id get article:readcount:id user-id:1086:fans user-id:1086:blogs user-id:1086:likes
-
共享session:redis将用户session集中管理,每次获取用户更新货查询登录信息都直接从redis中集中获取 spring session
负载均衡:把众多的访问量分到到其它的服务器上,让每个服务器的压力减少
-
分布式系统全局序列号:分库分表
incrBy orderId 1000 #redis批量生成序列号提升性能
如3台机器访问redis,利用redis特点:单线程incrby orderid 1000每次拿1千。0-1000;1001-2000;2001-3000.然后慢慢处理这1千容量
1.13 set与mset
set发生的过程:客户端传递到服务器(请求时间t1),服务器处理时间(t2)服务器向客户端传递处理结果(t3)
- set 5次,即 5*(t1+t2+t3)
- mset 5次,则t1+5*t2+t3
2 list(列表)
Redis中列表(list)类型是用来存储多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以存储2^32 – 1个元素。大概40多亿
列表类型有以下特点:
- 列表中的元素是有序的,即可以通过索引下标获取某个元素或者某个范围内的元素列表;
- 列表中的元素可以是重复的;
2.1 添加
语法:lpush key element [element …] 最新在最左位置
语法:Rpush key element [element …] 最新在最右位置
- lpush list e1 #将一个纸或多个值,插入到列表头部(左)
- lpush list e2
- lpush list e3
- Rpush list e4 #将一个值或多个值,插入到列表位部(右)
2.2 获取值
语法:lRange key start stop
- lrange list 0 -1 #获取全部list中值
- lrange list 1 1 #获取位置1值
语法:lindex key index 从0开始
- lindex list 1 #下标获得list中的某一个值
- lindex list -1 #最后一个值
2.3 移除首尾
语法:lpop key [count]
语法:rpop key [count]
- lpop list #移除首个 最左个
- rpop list #移除尾个 最右个
2.4 长度
语法:llen key
- llen list
2.5 准确移除
语法:lrem key count element
- count>0,从左到右,删除最多count个元素;
- count<0,从右到左,删除最多count绝对值个元素;
- count=0,删除所有元素。
lrem list 1 one
2.6 截断
语法:ltrim key start stop 通过下标截取指定的长度
- ltrim list 1 2 #ltrim key start stop
2.7 移动
语法:rpoplpush source destination
移除列表的最后一个元素,将他移动新的列表中
- rpoplpush list1 list2
2.8 更新
语法:lset key index element
将列表中指定下标的值替换为另外一个值,更新操作 存在,会更新;index不存在,会报错
- lset list1 0 item
2.9 插入
语法:linsert key before|after pivot element
- linsert list1 before h2 insert1
- linsert list1 after h2 insert2
2.10 阻塞
语法:blpop key [key …] timeout
语法:brpop key [key …] timeout
2.11 小结
- 它实际上是一个链表,before Node after ,let,right都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
消息排队!消息队列(Lpush Rpop) 栈(Lpush Lpop)
2.12 应用场景
消息队列:lpush + brpop命令组合即可实现阻塞队列
最新列表: list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表
排行榜:list类型的lrange命令可以分页查看队列中的数据. 但是只有定时计算的排行榜才适合使用list类型存储(实时不行).
3 set(集合)
无序不重复 (member) 40多亿
3.1 基本
语法:sadd key member [member …]
- sAdd set m1 #set集合中添加
语法:smembers key
- sMembers set #查看指定set的所有值
语法:sismember key member
- sisMermber set m1 #判断某一个值是不是在set集合中
3.2 个数
语法:scard key
- sCard set
3.3 移除
语法:srem key member [member …] #指定
- sRem set m2
语法:srem key [count]
- sPop set
3.4 随机抽取
语法:sRandMember key [count]
- sRandMember set
3.5 移动
语法:smove source destination member
- smove set1 set2 m1
3.6 集合关系
语法:sdiff key [key …]
- sDiff set1 set2 #差集
语法:sDiffStore destination key [key …] #返回集合存在destination
- sInter set1 set2 #交集(共同关注)
语法:sInterStore destination key [key …]
- sUnion set1 set2 #并集
3.7 小结
- 利用集合关系: 共同关注,共同爱好,二度好友,推荐好友(六度分割理论)
- 利用唯一性:统计访问网站的所有独立IP、获取当天的活跃用户列表
4 Hash(键值对)
Map集合,key-map
语法:hset key field value [field value …] #set一个具体key-value
- hSet uuid id 1 name admin time 2021-11-18
语法:hget key field #get一个字段值
-
hget uuid name
-
hmset hash f1 v1 f2 v2 #set 多个 key-value
-
hmget hash f1 f2 #get多个字段值
-
hgetall hash #get全部数据
4.1 删除
hdel hash f2
4.2 个数
hlen hash
4.3 判断
hexists hash f2
4.4 只获取
key
hkeys hash
value
hvals hash
4.5 增减value
hincrby hash f3 3
4.6 存在不设置,不存在设置
hsetnx hash f2 test 存在,失败0
hsetnx hash f4 test 不存在,成功1
4.7 小结
用户信息,变动信息,更适合对象的存储。String更适合对象存储
5 Zset(有序集合)
5.1 操作
语法:zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …]
zadd z 1 a
语法:zrange key min max
5.2 排序
语法:zrangeByScore key min max #从小到大
zrangeByscore z -inf +inf
语法:zrevRange key start stop #从大到小
zrevRange z 0 -1
5.3 移除
语法:zrem key member [member …]
5.4 个数
语法:zcard z
语法:zcount key min max #区间
5.5 应用
排序
权重
排行榜
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107121.html