zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Redis数据类型String\List\Set\Hash\Zset使用与应用场景(第二章)

RedisListset应用 string 场景 数据类型 HASH
2023-09-11 14:19:18 时间

五大数据类型 才基本语法,到应用场景描述
常用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 应用

排序

权重

排行榜