首页 > 数据库 >Redis的五种基本结构

Redis的五种基本结构

时间:2022-10-06 15:23:13浏览次数:76  
标签:hash Redis value 获取 五种 key scores zadd 结构

Stirng类型

操作成功返回大于0的数或 Integer1 操作失败Integer0 nil为空

基本指令

复制代码
1.添加一组键值对
set name Joshua
2.根据key获取value
> get name
"Joshua"
3.key删除指定的key > del name (integer) 1 > get name (nil)
4.统计该key对应的value的字符个数 > strlen name (integer) 6

5.给存在的key去追加数据 若键不存在则新增键 > append name -BlueSky > get name "Joshua-BlueSky" 键存在的情况 > append age 18 2 > get age "18" 6.批量添加多个键值对 > mset username Sohia age 18 gender male hobby book OK 7.一次性获取多个key的值 > mget username age gender hobby 1) "Sohia" 2) "18" 3) "male" 4) "book"
复制代码

扩展操作

复制代码
1.增量 +1
incr key

2.增量 -1
decr key 

3.指定增量 +
incryby key value
//value可以是负数
> incrby num -5
(integer) 5
4.指定增量 -
decrby key value

5.小数增量
> incrbyfloat num 0.1
6.1

6.小数减量
decrbyfloat num 0.2
5.9
复制代码

注:

  1.类型转换问题:整型转换为小数后,不可再对该数进行整加整减 -----> ERR value is not an integer or out of range

  2.:进行incr decr 的时候数据上限有大小限制 ---->  Long.MAX_VALUE 9223372036854775807   ---->ERR increment or decrement would overflow

  3.对于已存在的key,若再插入则会覆盖

设置数据的时效性

复制代码
1.某个key的value 设置值后  10秒后该值失效,无法再获取  时间单位:秒
setex key second value  

> setex userId 5 2205
OK
> get userId
"2205"
> get userId
(nil)

2.时间单位为毫秒
psetex key second value

> psetex num 5000 30
OK
> get num
"30"
> get num
(nil)
复制代码

注:

  1.若对同一个key设置新的时间则会覆盖之前的设置时长

Hash类型

·Hash类型的key为字符串类型,value为一个键值对

·在redis中 hash底层采用的是哈希表实现 哈希表的实现(数组 + 拉链法 | 数组 + 寻址法)

基本指令

复制代码
1.添加数据
hset key filed value
如果key或者field存在则覆盖

//2.获取数据
hget key field

3.获取所有field以及对应的value
hgetall key

4.删除数据--> 删除某个field以及value
hdel user field1 field2 ...

5.删除数据--> 删除整个hash
del key

6.添加或者修改多个数据
hmset   key field1 value1 field2 value2...

7.获取多个数据 
hmget key field1  field2...

8.获取hash中value的键值对个数
hlen key 

9.判断hash结构中是否存在某个filed  存在返回Internet1 不存在返回integer0
hexists key filed

10.获取hash中所有的filed
hkeys key

11.获取hash中key对应所有的value
hvals key

12.获取key所有字段信息
hgetall key --->大key

13获取所有value
hmget key filed1 filed2 filed3.......
复制代码

注:

应用场景:

  1.hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)

  2.每个hash可以存储2的32次方-1个键值对

  3.hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,

  4.切记不可滥用,更不可以将hash作为对象列表使用

  5.hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈

应用场景:

1.购物车设计

2.充值卷优惠卷抢购 hmset 商家id 商品的面值1 张数1 商品的面值2 张数

List类型

底层数据结构:双向链表

List中可以重复添加元素

基本操作

复制代码
1.从左边推入元素  
lpush key value1 value1......

2.从右边推入元素
rpush key value1 value1.....

3.取出元素 根据范围
lrange key start end 
lrange list1 0  2  --> 从list中0号位置开始取元素  到2结束  含头含尾
lrange list1 0 -1 -->取出list中所有的元素

4.根据下标查找
lindex key num

5.获取list中所有的元素个数
llen key

6.移除元素并返回  左或右
lpop key    左
rpop key    右

7.删除key
list del key

8.规定时间内获取元素
blpop key timeout
blpop list2 30 --> 从list2中的左边弹出元素,如果有就直接弹出,如果没有就等待30秒,如果30秒之后还是没有,则获取不到

复制代码

业务场景:

1.使用list实现朋友圈点赞记录

点赞从最先点赞的人开始,采用右推的方式显示,取消点赞需要定点删除 lrem 001 1 a --> 删除001集合中的元素a 只删除1个 微信用户的信息还需要单独找一个结构去存储

2.显示最近关注或者最新关注的粉丝 lpush

3.做日志的聚合 多台服务器 都向redis去发送日志信息 注意key保持一致

Set类型

与hash存储结构完全相同,仅存储键,不存储值(nil),并且键不允许重复,value也不允许重复,且无序,无序表示存入和取出的顺序不一致 

基本指令

复制代码
1.添加元素
sadd key value1 value2......

3.获取元素
smembers key

4.删除元素 可以批量
srem key value1 value2

5.删除key
del key

6.获取set中元素个数
scard key

7.判断set中是否包含某个元素   存在返回integer1 不存在则返回integer0
sismember key value 
复制代码

扩展:业务场景

一、向用户推介热词

复制代码
1.先准备一些用户可能感兴趣的数据
> smembers reconmend
1) "娱乐"
2) "宠物"
3) "科技"
4) "动漫"
5) "手机数码"

2.随机给用户取出感兴趣的分类或者条目  不影响总数
> srandmember reconmend
"动漫"
> srandmember reconmend
"宠物"
> srandmember reconmend
"娱乐"

3.随机取出一个词条,影响总数
> spop reconmend
"科技"
> smembers reconmend
1) "娱乐"
2) "宠物"
3) "手机数码"
4) "动漫"
复制代码

二、社交软件上推介好友,与好友的公共好友

复制代码
1.joshua拥有的好友
> smembers joshua
1) "Trump"
2) "Kamola"
3) "Bob"
4) "Jerry"

2.Sophia拥有的好友
> smembers Sophia
1) "Bob"
2) "Kamola"
3) "July"
4) "Linda"

3.取交集  ---共同拥有的好友
> sinter joshua Sophia
1) "Kamola"
2) "Bob"

4.取并集   两个人总的好友  去掉重复
> sunion joshua Sophia
1) "Trump"
2) "Kamola"
3) "July"
4) "Bob"
5) "Jerry"
6) "Linda"

5.取差集
> sdiff joshua Sophia
1) "Trump"
2) "Jerry"
> sdiff Sophia joshua
1) "July"
2) "Linda"

6.分别将 交、并、差集存入指定集合中
(1.) 交集
> sinterstore thesamefriend joshua Sophia
2
> smembers thesamefriend
1) "Bob"
2) "Kamola"

(2.)并集
> sunionstore allfriend joshua Sophia
6
> smembers allfriend
1) "Trump"
2) "Kamola"
3) "July"
4) "Bob"
5) "Jerry"
6) "Linda"

(3.)差集
> sdiffstore differentfriend joshua Sophia
2
> smembers differentfriend
1) "Trump"
2) "Jerry"
复制代码

三、将指定数据从原始集合移动到目标集合中

smove source destination member
smove u2 u1 w1 --> 表示将u2中的元素w1移动到u1中

 

四、redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索

1.显示共同关注(一度) 交集

2.显示共同好友(一度) 交集

3.由用户A出发,获取到好友用户B的好友信息列表(一度) 差集

4.由用户A出发,获取到好友用户B的购物清单列表(二度) 差集

5.由用户A出发,获取到好友用户B的游戏充值列表(二度) 差集

五、采用redis统计PV UV IP

PV 是网站访问量

UV 就是根据昵称统计访问次数 ----> 活跃用户 IP 独立访问的ip

PV key采用string类型解决 接触incr 根据访问量的增加而去递增 UV key采用hash类型进行解决 key是用户的昵称 value就是该用户访问的次数 IP 采用set体系即可

六、黑白名单的应用场景

爬虫容易给公司的运营团队带来一些困扰,会造成一些伪的PV访问

解决方案可以采用黑名单,

黑名单,比如该用户在登录之后造成了不正常的访问情况,就加入到黑名单 但是注意黑名单并不能完全决绝解决问题,因为这个账号不可以使用,那我们重新注册一个

所以我们还需要白名单,白名单就是添加这些可以访问的用户

结论 黑名单主要是限制访问的,白名单是安全加固

Sorted-set

在sort的基本上添加了可排序的字段

基本操作

复制代码
1.存数据        
zadd key value member

> zadd scores 94 math
(integer) 1
> zadd scores 86 Chinese
(integer) 1
> zadd scores 90 English
(integer) 1

2.取数据
(1.)升序
> zrange scores 0 2
1) "Chinese"
2) "English"
3) "math"
(2.)降序
> zrevrange scores 0 2
1) "math"
2) "English"
3) "Chinese"

3.带上withkey可跟上数据
> zrevrange scores 0 2 withscores
1) "math"
2) 94.0
3) "English"
4) 90.0
5) "Chinese"
6) 86.0

4.删除某个元素
> zrem scores math
1

5.根据条件获取
> zrangebyscore scores 90 100  withscores
1) "English"
2) 90.0
3) "math"
4) 94.0
(1.)加上limit count value 限制条数
> zrangebyscore scores 90 100 withscores limit count 1
1) "English"
2) 90.0

6.根据条件进行删除           
(1.)范围
> zremrangebyscore scores 90 100
2
(2.)索引
zremrangebyrank  scores 0  -1

7.获取集合总数量
> zcard scores
3
(1.)根据范围获取
> zcount scores 90 100
1


7.集合交、并操作

 zinterstore destination numkeys key [key …]
 zunionstore destination numkeys key [key …]127.0.0.1:6379> zadd s1 50 aa 60 bb 70 cc
(integer) 3
127.0.0.1:6379> zadd s2 60 aa 40 bb 90 cc
(integer) 3
127.0.0.1:6379> zadd s3 70 aa 20 bb 100 cc

 zinterstore s4 3 s1 s2 s3  取并集

 zrange s4 0 -1 withscores
注意此时的交集会帮助我们计算s1 s2 s3  他们三个相加的和

求最大值
zinterstore s5 3 s1 s2 s3 aggregate max  在取出并集的时候 之取出最大的值
 zrange s5 0 -1 withscores
1) "bb"
2) "60"
3) "aa"
4) "70"
5) "cc"
6) "100"

8.获取某个元素的值
> zscore scores math
80.0

9.热门排行的数据获取
根据条件进行正向获取或者反向获取  获取排名号
> zrank scores math
0
> zrank scores Chinese
1
> zrank scores Sport
2
反向获取
> zrevrank socres Sport

10.对某个元素的值进行增量或减量
> zincrby scores 2 math
82.0
> zincrby scores -5 math
77.0

11.权重记录  
  比如某些任务可以设置或者添加权重  那么权重越高这些任务就越先执行

127.0.0.1:6379> zadd tasks 4 order:id:005
(integer) 1
127.0.0.1:6379> zadd tasks 1 order:id:425
(integer) 1
127.0.0.1:6379> zadd tasks 9 order:id:3445
(integer) 1
127.0.0.1:6379> zrevrange tasks 0 -1 withscores
1) "order:id:3445"
2) "9"
3) "order:id:005"
4) "4"
5) "order:id:425"
6) "1"
127.0.0.1:6379>

12.基于一些会员临时体验  或者会员到期提醒
zadd ts 1509802345 uid:001

zadd ts 1509802390 uid:007

zadd ts 1509804282 uid:888
复制代码

注:

   1.score 保存的数据存储空间是64位,如果是整数范围是int类型最大值

   2.score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时侯要慎重,比如0.3或者0.7... 这样的数据去计算2的倍数就会存在小数位          

   3.sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果

业务场景:  

   1.设置临时体验会员或会员到期提醒

   2.权重记录,某些任务设置权重,权重越高的任务优先执行

  3.热门排行的数据获取

Redis的通用命令

复制代码
del key 删除key
exists key 判断key是否存在
type key获取key的类型
expire key seconds/milliseconds 为指定key设置有效期
ttl key 获取key剩余的时效 返回3种结果,一是在有效期返回有效时长,而是不在有效期返回-2,三是既没有有效期又存在返回-1
persist key 设置key的时效为永久
keys * 查看所有的key
rename key newkey 为key进行重命名
Sort key 对集合类型排序
select index 切换数据库
move key db 移动数据到指定的库
dbsize(查看库中的key总数)
flushdb(删除当前库的数据)
flushall(删除所有库的数据)

标签:hash,Redis,value,获取,五种,key,scores,zadd,结构
From: https://www.cnblogs.com/Joshua-BlueSky/p/16757680.html

相关文章