第1节:Redis五种数据结构以及用法

一、Redis的基础操作

1. keys       查看key  

查看当前库所有key

keys *

2. exists     存在key  

判断某个key是否存在: exists <key>

-- 查看k1是否存在

exists k1

3. type       key类型  

-- 查看key是什么类型:  type <key>

-- 查看k1的类型

type k1

4. del          删除key  

-- 删除指定的key数据,可填写多个key: del <key1> <key2>...

-- 删除k1

del k1

5. expire    设置时间  

-- 为给定的key设置过期时间,单位秒:    expire <key> <过期时间>

-- 设置k4的过期时间为10秒

expire k4 10

6. ttl           查看剩余时间  

-- 查看还有多少秒过期,-1表示永不过期,-2表示已过期,过期即删除:    ttl <key>

-- 查看k4还有多少秒过期

ttl k4

7. Dbsize    key数量   

-- 查看当前数据库的key的数量

Dbsize

8. flush       清空    

-- *******慎用*******

-- 清空当前库

flushdb

-- 通杀全部库

flushall

-- *******慎用*******

9. select     切换数据库

-- 切换数据库 默认是0库: select <base>

-- 将数据库切换到1

select 1

-- 将数据库切换到0

select 0

10.set         设置值

设置值

Set k1 v1

11.mset      批量插入

mset k1 v1 k2 v2 k3 v3 k4 v4 k5 v5

12.unlink    查看成功删除的个数

unlink k2 k3

二、String 类型

Redis的key是String类型的,如果Value如果也是String类型,相当于把两个字符串映射起来,即key-value

存储字符串,整数,浮点数。

1. set             添加键值对,key已存在会覆盖value:

-- k1:v100

set k1 v100

2. get            获取k1的值

get k1

3. append    在k1的值后添加字符串abc

append k1 abc

4. strlen        查看k1的长度

strlen k1

5. setnx        不存在时,才可以设置key的值

-- 只有在key不存在时,才可以设置key的值:   setnx <key> <value>

-- setnx 一个存在的key

setnx k1 v1

-- setnx 一个不存在的key

setnx k3 v300

6. incr decr  value+-1

-- 将k4的值+1

incr k4

-- 将k4的值-1

decr k4

7. mset  mget  批量设值,批量获取

同时设置一个或多个key-value键值对: mset <key1> <value1> <key2> <value2>...

-- 一次性set多个key  k1:v1,k2:v2,k3:v3

mset k1 v1 k2 v2 k3 v3

批量获值

同时获取k1 k2 k3的值

mget k1 k2 k3

8. getrange  获取下标值

-- 获取下标0~3的值

getrange k10 3

-- 将字符串abc从下标3开始覆盖

setrange k1 3 abc

9.setex          添加age的同时设置过期时间

-- 添加age的同时设置过期时间为20秒

setex age 20 value30

10. ttl            查看剩余时间

ttl age

11.getset     设置值且获取值

-- 将name的值设置为jack并获取name的原值

getset name jack

-- 查看是否设置为新值

get name

三、列表

结构:双向链表  操作两头容易,通过索引操作麻烦,做队列使用,有序,值不唯一

应用场景

1. 由于项目中使用了大量的wcf,导致配置过多,维护和更新异常繁琐,基于这种情况,我们把wcf可以异步处理的所有请求都丢到了redisList中去,这样下来之后,web站点的config配置清爽的不要不要的。

2. 还有一个业务就是我们做的淘宝订单催付,付款提醒,签收提醒,收货提醒 等等都是采用轮询List的方式,大大降低了代码复杂量。

1. lpush        从左依次插入一个或多个值

-- 从左边/右边插入一个或多个值: lpush/rpush <key> <value1> <value2> <value3>...

-- k1从左依次插入v1 v2 v3

lpush k1 v1 v2 v3

2. rpush        从右依次插入一个或多个值

-- k2从右依次插入v1 v2 v3

rpush k2 v1 v2 v3

3. lrange       根据下标查看

-- 按照索引下标获得元素(从左到右)0左边第一个,-1右边第一个,(0-1表示获取所有):   lrange <key> <start> <stop>

lrange k2 0 2

lrange k2 0 -1

4. l/r pop      从左边/右边吐出一个值

-- 从左边/右边吐出一个值。值在键在,值光键亡:  lpop/rpop <key>

-- 从k1的左边取出一个

lpop k1

-- 从k2的右边取出一个

rpop k2

-- 将k1和k2的值全部拿出  一直pop就行

rpop k1

rpop k1

rpop k2

rpop k2

-- 查看k1和k2是否存在,0:不存在

exists k1

exists k2

5. lindex       根据下标获取值

-- lindex <key> <index>按照索引下标获得元素(从左到右),下标从0开始

lindex k2 0

6. llen            获取列表长度

-- 获得列表长度:  llen <key>

llen k2

7. linsert       指定插入

在指定的值的前面或者后面进行插入

-- 在<value>的前面/后面插入<newvalue>

: linsert <key>  before/after <value> <newvalue>

linsert k2 before "v11" "newv11"

-- 查看

lrange k2 0 -1

linsert k2 after "v12" "newv11"

-- 查看

lrange k2 0 -1

8.  lrem         删除

-- 删除n个<value>(从左到右):  lrem <key> <n> <value>

-- 删除1个k2中的newv11

lrem k2 1 "newv11"

-- 查看

lrange k2 0 -1

9. lset            替换

-- 将列表key中下标为index的值替换成value:   lset <key> <index> <value>

-- 将k2中下标1的值换为julong

lset k2 1 julong

-- 查看

lrange k2 0 -1-                      

四、集合

不能有重复,里面是无序的,值唯一

1. sadd               插入

-- 将一个或多个元素加入到集合key中,已经存在的元素将被忽略:  sadd <key> <value1> <value2>

-- 将v1 v2 v3加入到k1集合中

sadd k1 v1 v2 v3

2. smembers     取出该集合的所有值

-- 取出该集合的所有值:   smembers <key>

smembers k1

3. sismember    判断是否有值

-- 判断集合<key>是否为含有该<value>值:    dismember <key> <value>

-- k1集合中是否存在v1

sismember k1 v1

4. scard              返回元素个数

-- 返回该集合的元素个数:  scard <key>

-- 查看k1集合中元素的个数

scard k1

5. srem              删除value

-- 删除k1集合中的v1和v2

srem k1 v1 v2

6. spop              随机取元素

-- 随机取出k2集合中的一个元素

spop k2

7. srandmember    随机取n个值

-- 随机从该集合中取出n个值,不会从集合中删除:  srandmember <key> <n>

-- 随机从k2集合中取出两个元素

srandmember k2 2

8. smove           移动到另一个集合

-- 把<source>集合中的一个元素移动到<destination>集合中:   smove <source> <destination> <value>

-- 将v1 v2 v3加入到k3集合中,将v3 v4 v5加入到k4 集合中

sadd k3 v1 v2 v3

sadd k4 v3 v4 v5

-- 把k3集合中的v3移动到k4集合中

smove k3 k4 v3

-- 把k3集合中的v2移动到k4集合中

smove k3 k4 v2

-- 查看k3,v2和v3呗移走

smembers k3

-- 查看k4,v3不会重复

smembers k4

9. sadd              获取交集

-- 获取两个集合的交集元素:    sinter <key1> <key2>

-- 将v1 v2 v3加入到k5集合中,将v3 v4 v5加入到k6 集合中

sadd k5 v1 v2 v3

sadd k6 v3 v4 v5

-- 获取k5和k6的交集元素

sinter k5 k6

          

10. sunion         获取并集

-- 获取两个集合的并集元素:    sunion <key1> <key2>

-- 获取k5和k6的并集元素

sunion k5 k6     

11. sdiff             获取差集

-- 获取两个集合的差集元素(key1中有,但key2没有的):  sdiff <key1> <key2>

-- 获取k5和k6的差集元素

sdiff k5 k6                 

五、哈希

数组+链表   value是一个无序字典,field是域

常常用来插入对象,field 不能相同,value 可以相同

1. hset               添加元素

-- 添加<field> <value>键值对元素到<key>哈希表中:    hset <key> <field> <value>

-- 添加id:1,name:zhangsan到user:1001集合中

hset user:1001 id 1

hset user:1001 name zhangsan

2.hget               获取元素

-- 从<key>集合取出<field>域的value值:    hget <key> <field>

-- 获取user:1001的id和name

hget user:1001 id

hget user:1001 name

3. hkeys            获取域

-- 获取哈希表中所有的域field

-- 获取user:1001所有的域field

hkeys user:1001

4. hvals             获取域的value

-- 获取哈希表中所有域的value

-- 获取获取user:1001所有域的value

hvals user:1001

5. hgetall         获取域以及value

-- 获取<key>所有的<field>及其<value>: hgetall <key>

-- 获取user:1001的所有域及其value

hgetall user:1001

6. hmset          批量添加Redis4.0后被弃用,可直接使用hset

-- 批量添加<key>的<field><value>:   hmset <key> <field1> <value1> <field2> <value2>...

-- 哈希表user:1002 添加 id:2,name:lisi,age:30

hmset user:1002 id 2 name lisi age 30

7. hgetall         查看

-- 查看user:1002

hgetall user:1002

8. hexists         判断存在

-- 查看哈希表key中,给定域field是否存在: hexists <key> <field>

-- 查看user:1002哈希表中,是否存在域id

hexists user:1002 id

-- 查看user:1002哈希表中,是否存在域address

hexists user:1002 address

9. hincrby        域减少

-- 为哈希表key中的域field的值加上增量<increment>(可以是负数) hincrby <key> <field> <increment>

-- 将哈希表user:1002中的age域增加2

hincrby user:1002 age 2

-- 将哈希表user:1002中的age域减少5

hincrby user:1002 age -5

10. hsetnx       域设置值

-- 将哈希表key中的域field的值设置为value,当且仅当域field不存在时还生效:    hsetnx <key> <field> <value>

-- 将哈希表user:1002中的age域的值设置为40

hsetnx user:1002 age 40

-- 将哈希表user:1002中的gender域的值设置为10

hsetnx user:1002 gender 10

-- 查看哈希表user:1002

hgetall user:1002

六、有序集合

特点:

使用散列表和跳跃表实现,可以更改分数调整中间顺序,

用来实现排行榜元素不允许重复。

有序集合的每个元素都会关联一个 double 类型的分数(score)。redis 通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数可重复。

1. zadd                     添加元素

-- 将一个或多个元素及其score值加入到有序集合key当中:  

zadd  <key> <score1> <value1> <score2> <value2>…

例子:

-- 将200:java,300:c++,加入到topn集合中

zadd topn 200 java 300 c++

2. zrange                 下标获得元素

-- 获取有序集合key中,下标在<start><stop>之间的元素,注:0 ,-1为全部获取

-- 命令:zrange <key> <start> <stop>  [WITHSCORES]

-- 可选:[WITHSCORES]可将分数和值一起返回

例子:

-- 获取topn有序集合中的所有value

zrange topn 0 -1

-- 获取topn有序集合中的所有value及score

zrange topn 0 -1 withscores

3. zrangebyscore   按照范围返回

-- 返回有序集合key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列

-- 命令:zrangebyscore key min max [withscores] [limit offset count]

-- 可选:[WITHSCORES]可将分数和值一起返回

-- 可选:[limit offset count] 控制返回数据的位置及数量和mysql中的limit一致:limit 10,20 就是从第10个开始,返回20条数据

例子:

-- 获取topn有序集合中score值介于300和500之间的数据,按score从小到大排列

zrangebyscore topn 300 500

-- 获取topn有序集合中score值介于300和500之间的数据,按score从小到大排列,并显示scorec

zrangebyscore topn 300 500 withscores

-- 获取topn有序集合中score值介于300和500之间的数据,按score从小到大排列,并显示scorec,只显示第2、3条数据

zrangebyscore topn 300 500 withscores limit 1 2

4. zincrby                 给对应的key的value增加分数

-- 将有序集合<key>中的给定<value>的score增加<increment>:    zincrby <key> <increment> <value>

-- 将有序集合topn中的java分数加上50

zincrby topn 50 java

-- 将有序集合topn中的mysql分数减去20

zincrby topn -20 mysql

5. zrem                     删除value

-- 删除有序集合<key>下,指定<value>的元素:  zrem <key> <value>

-- 删除有序集合topn中的php

zrem topn php

-- 查看topn中的元素

zrange topn 0 -1 withscores

6. zcount                  统计分数的个数

-- 统计有序集合<key>中,分数在[<min>,<max>]区间内的元素个数:   zcount <key> <min> <max>

-- 统计有序集合topn中,分数在[200,300]区间内的元素个数

zcount topn 200 300

7. zrange                  获得排名

-- 获取<value>在有序集合<key>中的排名,从0开始:   zrank <key> <value>

-- 查看有序集合topn

zrange topn 0 -1 withscores

-- 获取java在有序集合topn中的排名

zrank topn java

-- 获取mysql在有序集合topn中的排名

zrank topn mysql

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇以航QvQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值