Redis的常用命令及五种数据结构

1.Redis的常用命令

在redis中key-value类型是总类型,在redis中对于value数结构是严格区分的,存在五种不同的value数据类型。

1.1keys *

表示在客户端查看当前redis服务端内存中所有的数据key值。将已有的数据返回,没有数据时,返回空。这里返回的都是内存中保存的数据key值。

通过命令redis-cli -p 9000 登录一个客户端,通过keys * 查看:

注意:

1.不支持分布式结构。不能通过一个keys *从一个redis服务中查看其它redis数据

2.生产环境(客户使用环境)使用keys *不合理,造成读数据阻塞(一次读太多数据)

1.2 exists key 

表示要查看一下对应的key值数据是否在redis内存中存在

存在的情况

不存在的情况

 

不可以使用get这种读操作代替exists判断存在的操作,因为使用读判断存在,浪费了读数据的带宽。而且redis 最新版本一个value数据可以,达到1GB大小

1.3 expire/pexpire key time

在redis中,可以根据需求对写入的数据设置超时时间,一旦到达超时条件将会在内存中把数据删除,expire 对某个key的数据做秒单位的超时,pexpire对key值做毫秒单位的超时。没有使用相关超时的数据写入时,默认是永久数据

例如:设置name 70秒的超时时间

超时后再次查看,对应的数据已经被删除

 1.4 ttl/pttl key

在执行设置了超时时间的key值上,查看这个key的剩余时间。ttl操作一个key能够看到剩余时间单位是秒,pttl看得是毫秒

例:查询上面name剩余的时间

1.5del key删除数据

del可以对指定的key-value进行删除操作

例如:删除 num 

1.6 save 存储持久化

redis支持持久化,将内存数据,输出到持久化文件,内存数据保存在磁盘上。
redis重新启动时自动加载保存的持久化文件,将数据恢复回来。
save命令的调用,就是将内存数据输出到持久化文件中保存。

可以使用kill -9 模拟redis的突然断电效果

1.7flushall

冲刷所有,删除所有数据。将当前redis服务的内存数据和持久化文件中的数据全部清空。
尽可能只在测试环境使用,不要到生产环境

2.五种数据结构

 redis是以key-value结构存储数据的,但是根据不同的应用场景,可以使用完全不同的value结构存储数据。包括:String字符串,Hash,List链表,Set集合,ZSet有序集合

2.1String类型数据

2.1.1 set key value

redis中可以对字符串类型进行写操作调用set命令,也可以在已有数据时,对数据覆盖操作。在redis的大量命令都可以携带很多不同的参数选项。使用详细的选项和参数,可以从redis官网去查看 https://redis.io/

EX:可以在set时直接设置超时秒数

PX:可以在set时直接设置超时毫秒数

  • 127.0.0.1:6379> set bomb tnt EX 50
  • OK
  • 127.0.0.1:6379> ttl bomb
  • (integer) 46
  • 127.0.0.1:6379> 

NX:在执行set时,会判断redis中有没有该key值,如果有则无法set,没有则可以set成功。表示,只有第一个set数据的客户端可以成功,后续都会失败。

  • 127.0.0.1:6379> keys *
  • 1) "age"
  • 127.0.0.1:6379> set age 22 NX
  • (nil)
  • 127.0.0.1:6379> set name wanglaoshi NX
  • OK
  • 127.0.0.1:6379>

XX:在执行set时,会判断redis中有没有key值,有的时候才会set成功,没有则不成功。表示,使用XX的客户端没有新建的权限。

  • 127.0.0.1:6379> keys *
  • 1) "age"
  • 127.0.0.1:6379> set gender male XX
  • (nil)
  • 127.0.0.1:6379> set age 55 XX
  • OK

2.1.2 get key 

从redis中读取key值的value数据。在redis中value最大数据长度1GB。

  • 127.0.0.1:6379> get age
  • "55"
  • 127.0.0.1:6379> 

如果想要删除字符串类型数据就是调用del命令

2.1.3 incr/incrby decr/decrby

执行计步器,可以增加数值,减少数值。对应value字符串数据必须是纯数字

  • 127.0.0.1:6379> incr age
  • (integer) 56
  • 127.0.0.1:6379> decr age
  • (integer) 55
  • 127.0.0.1:6379> incrby age 10
  • (integer) 65
  • 127.0.0.1:6379> decrby age 20
  • (integer) 45

常见的应用使用计步器:

记录排队人数(拿号,自增,叫号后,前剩余人数自减);

在线人数统计(每秒钟上下变动)

2.1.4数据类型String应用场景

一般使用String类型的value数据实现 缓存的功能。并且可以利用代码的序列化和反序列化的方法,将对象序列化为字符串(user-->{“userName”:“wanglaoshi”}).在easymall中使用序列化将product对象变成json,以商品id作为唯一key值操作商品在redis的缓存数据。

2.2 hash类型

hash在redis中底层双层map形式存在,key-value是map,value在hash结构中又是一个map。所以他可以对应对象的数据结构。

2.2.1 hset key field value

在redis中创建一个key值为key  对应第二层map的key为field,

第二层map的value为value

  • 127.0.0.1:6379> hset user age 18
  • (integer) 1
  • 127.0.0.1:6379> hset user name wanglaoshi
  • (integer) 1
  • 127.0.0.1:6379> hset user gender male
  • (integer) 1
  • 127.0.0.1:6379> keys *
  • 1) "age"
  • 2) "user"
  • 127.0.0.1:6379>

2.2.2 hget key field

由于hash结构双层map,hget可以读取到一个属性的值,指定某个key的 某个属性读取

  • 127.0.0.1:6379> hget user name
  • "wanglaoshi"
  • 127.0.0.1:6379> hget user age
  • "18"
  • 127.0.0.1:6379>

2.2.3 hkeys/hvals key

hkeys key从key值的hash数据结构中将所有的field属性名称返回

hvals key 从key的hash数据结构中将所有的field的值返回

  • 127.0.0.1:6379> hkeys user
  • 1) "age"
  • 2) "name"
  • 3) "gender"
  • 127.0.0.1:6379> hvals user
  • 1) "18"
  • 2) "wanglaoshi"
  • 3) "male"
  • 127.0.0.1:6379>

2.2.4 删除数据

如果想将整个hash结构删掉,直接调用del 全部删除

如果删除的是一个hash结构中的某个属性和值---hdel key field

  • 127.0.0.1:6379> hkeys user
  • 1) "age"
  • 2) "name"
  • 3) "gender"
  • 127.0.0.1:6379> hdel user age
  • (integer) 1
  • 127.0.0.1:6379> hkeys user
  • 1) "name"
  • 2) "gender"
  • 127.0.0.1:6379>

2.2.5 hincrby 

为哈希表中的字段值加上指定增量值。
增量也可以为负数,相当于对指定字段进行减法操作。
如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误。

  • 127.0.0.1:9000> hset user age 18
  • (integer) 1
  • 127.0.0.1:9000> hincrby user age 1
  • (integer) 19
  • 127.0.0.1:9000> 

2.2.5应用场景

也可以像String一样,执行某个项目中的缓存逻辑。不同环境使用不同结构,有不同的效果。

例如,缓存数据对象的结构比较复杂,属性不仅仅是Integer String 还有数组,list,还有set,优先使用String类型,如果对象属性简单可以使用hash(造成代码编写复杂)

2.3 List双向链表

list底层双向链表,可以从头和尾部处理数据,实现队列的结构(就为了处理消息队列逻辑)。

2.3.1 lpush/rpush key value

l/r 表示左和右。lpush从链表头部,插入数据,rpush从链表的尾部,插入数据

  • 127.0.0.1:6379> lpush student wangcuihua
  • (integer) 1
  • 127.0.0.1:6379> lpush student liuyoucai
  • (integer) 2
  • 127.0.0.1:6379> rpush student zhangshoufu
  • (integer) 3
  • 127.0.0.1:6379>

行程链表结构顺序:

liuyoucai 
wangcuihua 
zhangshoufu

2.3.2 lrange key start end

可以对一个list链表中的元素范围内的数据读取返回。

lrange student 起始下标 结束下标

  • 127.0.0.1:6379> lrange student 0 4
  • 1) "liuyoucai"
  • 2) "wangcuihua"
  • 3) "zhangshoufu"
  • 127.0.0.1:6379> lrange student 1 4
  • 1) "wangcuihua"
  • 2) "zhangshoufu"
  • 127.0.0.1:6379> 

有时候,咱们并不会确定不知道元素的个数,要想查看所有的元素可以使用-1的end结尾

表示一直到尾部。start=0 end=-1 就可以查询一个list所有内容

  • 127.0.0.1:6379> lrange student 0 -1
  • 1) "liuyoucai"
  • 2) "wangcuihua"
  • 3) "zhangshoufu"
  • 127.0.0.1:6379> 

2.3.3 lset key 元素下标index 修改值

不建议使用,双向链表操作最有效,速度最快是对头尾的操作。
lset可能从中间操作链表,效率非常低
对list的某个下标为index的元素值,做修改

  • 127.0.0.1:6379> lrange student 0 -1
  • 1) "liuyoucai"
  • 2) "wangcuihua"
  • 3) "zhangshoufu"
  • 127.0.0.1:6379> lset student 1 haha
  • OK
  • 127.0.0.1:6379> lrange student 0 -1
  • 1) "liuyoucai"
  • 2) "haha"
  • 3) "zhangshoufu"
  • 127.0.0.1:6379>

2.3.4 rpop/lpop key

rpop从链表的尾部删除元素,并且将删除的元素值返回

lpop从链表的头部删除元素,将元素值返回(remove)

  • 127.0.0.1:6379> lrange student 0 -1
  • 1) "liuyoucai"
  • 2) "haha"
  • 3) "zhangshoufu"
  • 127.0.0.1:6379> rpop student
  • "zhangshoufu"
  • 127.0.0.1:6379> lpop student
  • "liuyoucai"
  • 127.0.0.1:6379> lrange student 0 -1
  • 1) "haha"
  • 127.0.0.1:6379>

配合lpush和rpush实现排队机制,先到先得

2.3.5应用场景

初始目的就是利用list的类型实现排队队列的处理逻辑,先来先得,先到先处理。

可以在元素中封装一些消息属性,先进入队列,优先被pop出去进行处理。

2.4.SET集合

可以将不同的,不重复的元素值,放到一个没有顺序概念的集合中,实现value数据在redis的管理

2.4.1sadd key member

新增元素到集合中。

  • 127.0.0.1:6379> sadd favor math english geo
  • (integer) 3

2.4.2 srandmember key [count]

随机在key对应set集合中选取count个元素。

下面分别为随机选取一个、随机选取2个,如果选取的值等于实际值,则全部显示

  • 127.0.0.1:6379> srandmember favor
  • "english"
  • 127.0.0.1:6379> srandmember favor 2
  • 1) "math"
  • 2) "geo"

2.4.3 srem key 元素值

可以对集合中某个元素进行去除的操作,当删除成功,返回1,删除失败返回0

  • 127.0.0.1:6379> srem favor math
  • (integer) 1
  • 127.0.0.1:6379> srem favor mathdasfdads
  • (integer) 0
  • 127.0.0.1:6379>

2.4.4 sismember 查看一个元素是否属于这个集合

  • 127.0.0.1:6379> sismember favor math
  • (integer) 0
  • 127.0.0.1:6379> sismember favor english
  • (integer) 1
  • 127.0.0.1:6379> 

2.4.5常用场景

登录系统时,给用户帖的标签。

例如:登录一些今日头条这种推荐文件,推荐网站的系统,注册后选择自己兴趣爱好:军事,数学,历史,天文,登陆后会跟你你选择的内容,随机推荐不同的文章。

直播网站:lol 王者荣耀 dota2其他,根据兴趣推送相关直播

还可以实现好友保存,计算共同好友

2.5 ZSET有序集合

在set基础之上,实现了排序的方式,元素也是不可以重复,就是在元素的数据上绑定了一个

评分的数字(实际应用场景中,评分可以有不同业务意义,例如点击次数,例如播放量,例如投票数量等)

2.5.1 zadd key score member

可以将一个元素绑定一个分数后,写入到一个有序集合中

  • 127.0.0.1:6379> zadd score 98 zhangsan
  • (integer) 1
  • 127.0.0.1:6379> zadd score 97 lisi
  • (integer) 1
  • 127.0.0.1:6379> zadd score 80 wangwu
  • (integer) 1
  • 127.0.0.1:6379> zadd score 15000 zhoaliu
  • (integer) 1

2.5.2 排序查询rank/range

在有序集合中主要就是为了体现排序,所以使用命令最多的查询方式

就是排序相关内容

zrank key member:看看member的排名 

  • 127.0.0.1:6379> zrank score zhansan
  • (integer) 2

zrange key start stop:查询排名从start开始到stop范围内所有元素 
起始排名是0,可以对stop=-1查到末尾

  • 127.0.0.1:6379> zrange score 0 -1
  • 1) "zhangsan"
  • 2) "lisi"
  • 3) "wangwu"
  • 4) "zhaoliu"
  • 127.0.0.1:6379> 

zrangebyscore key minscore maxscore:在上限评分和下限评分之间的所有元素和排序 

  • 127.0.0.1:6379> zrangebyscore score 50 200
  • 1) "zhangsan"
  • 2) "lisi"
  • 3) "wangwu"

2.5.3 zrem key member

将元素从zset类型的数据中删除

2.5.4 常用应用场景

网站各种排名,都可以使用ZSET有序集合

视频网站:热播剧,top10。

热搜:话题搜索次数。

小说网站:订阅量排序,月票排序

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值