Redis管理实战

2020-03-18 分类:数据库相关 阅读(72) 评论(0)

数据类型

String: 字符串类型
Hash: 哈希类型
List: 列表类型
Set: 集合类型
Sorted set: 顺序集合类型

管理实战

通用操作

#查看所有的key
127.0.0.1:6379> KEYS *
1) "age"
2) "name"
#判断key是否存在
127.0.0.1:6379> EXISTS name
(integer) 1
#变更key名
127.0.0.1:6379> RENAME age nianling
#查看key的类型
127.0.0.1:6379> type name
string
#删除key
127.0.0.1:6379> del name
(integer) 1
#以秒为单位设置生存时间
127.0.0.1:6379> EXPIRE name 10
(integer) 1
#以毫秒为单位设置生存时间
127.0.0.1:6379> PEXPIRE name 10000
(integer) 1
#取消剩余生存时间
127.0.0.1:6379> PERSIST name
(integer) 1

strings(字符)类型操作

应用场景:
常规计数:微博数、粉丝数、直播平台

增:

#设置key
127.0.0.1:6379> set name nfsnobody
OK
#设置多个key
127.0.0.1:6379> mset name nfsnobody age 18 sex m
OK
#设置值、取值同时进行
127.0.0.1:6379> GETSET name nfsnobody
(nil)
127.0.0.1:6379> GETSET name nfsnobody
"nfsnobody"
#设置值同时设置生存时间
127.0.0.1:6379> set name nfsnobody ex 10
OK
#数量递归增加
127.0.0.1:6379> incr num
(integer) 1
#指定增加数值
127.0.0.1:6379> incrby num 2
(integer) 8
#数量递减
127.0.0.1:6379> DECR num
(integer) -1
#指定递减数
127.0.0.1:6379> DECRBY num 2
(integer) -3
#浮点增加
127.0.0.1:6379> incrbyfloat float 0.6
"0.6"

删:

#删除已有key
127.0.0.1:6379> DEL num

改:

#追加(若该键不存在,则创建)
127.0.0.1:6379> APPEND name nfs
(integer) 6
#查看追加内容
127.0.0.1:6379> get name
"nfsnobodynfs"
#修改第N个字符串
127.0.0.1:6379> SETRANGE name 3 a
(integer) 6
#查看结果
127.0.0.1:6379> get name
"nfsnobodyagx"

查:

#获取key值
127.0.0.1:6379> get name
"nfsnobody"
#查看string类型的长度
127.0.0.1:6379> STRLEN name
(integer) 6
#查看指定长度的string类型
127.0.0.1:6379> GETRANGE name  0 4
"nfsnobodyag"
#以秒查询key剩余生存时间
127.0.0.1:6379> ttl name
(integer) 8
#以毫秒查询key剩余生存时间
127.0.0.1:6379> pttl name
(integer) 44016
#获取多个key值
127.0.0.1:6379> mget name age sex
1) "nfsnobody"
2) "18"
3) "m"

应用场景实现:

#粉丝数量增加,每点一次关注,都执行以下命令一次
127.0.0.1:6379> incr num
(integer) 1
#取消关注则执行以下命令一次
127.0.0.1:6379> DECR num
(integer) -1
#显示粉丝数量
127.0.0.1:6379> get num
"6"
#暗箱操作,刷粉丝
127.0.0.1:6379> incrby num 10000
(integer) 10006

hash(字典)类型操作

应用场景:
存储部分变更的数据,如用户信息,商品信息等。
最接近表结构的一种类型。

增:

#创建car的price值
127.0.0.1:6379> hset car price 500
(integer) 1
#创建car的name值
127.0.0.1:6379> hset car name BMW
(integer) 1
#创建car的date值
127.0.0.1:6379> hset car date 1982
(integer) 1
#设置多个哈希key(类似于MySQL的一个表中的一行数据)
127.0.0.1:6379> hmset teacher name nfsnobody age 18 sex m
OK
127.0.0.1:6379> hmset teacher name nfs age 80 sex f
OK

删:

#删除hash类型中的一个值
127.0.0.1:6379> HDEL teacher name
(integer) 1
#删除整个hash类型key
127.0.0.1:6379> DEL teacher
(integer) 1

改:

#修改hash类型值 增加1
127.0.0.1:6379> hincrby myhash num 1
(integer) 1

查:

#获取car的name值
127.0.0.1:6379> hget car name
"BMW"
#获取key的全部value和值(运维常用)
127.0.0.1:6379> hgetall car
1) "price"
2) "500"
3) "name"
4) "BMW"
5) "date"
6) "1982"
#获取key中部分值
127.0.0.1:6379> HMGET teacher name sex
1) "nfsnobody"
2) "m"

List(列表)类型操作

应用场景:
消息队列系统
> 比如sina微博:在redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。
但是做了限制不能超过5000个ID,因此获取ID的函数会一只询问redis。
系统不会像传统方式那样“刷新”缓存,redis实例中的信息永远是一致的。
SQL数据库(或是硬盘上的其他类型数据)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。

增:

#将一个值或者多个值插入列表的表头(若key不存在,则添加key并依次添加)
127.0.0.1:6379> lpush list nfsnobody
(integer) 1
127.0.0.1:6379> lpush list nfs
(integer) 2
127.0.0.1:6379> lpush list nfsnobody
(integer) 3
127.0.0.1:6379> lpush list alex
(integer) 4
#一行添加
127.0.0.1:6379> lpush teacher nfsnobody nfs nfsnobody alex
(integer) 4
#追加一个value值,若key不存在,则不创建
127.0.0.1:6379> LPUSHX teacher1 nfsnobody
(integer) 0
#在nfs前面添加nfsnobody
127.0.0.1:6379> linsert teacher before nfs nfsnobody
(integer) 6
#在尾部添加key
127.0.0.1:6379> rpush teacher wang5
(integer) 7
#将teacher的尾部元素弹出,再插入到teacher1的头部
127.0.0.1:6379> rpoplpush teacher teacher1
"wang5"
#查看一个列表内有多少行
127.0.0.1:6379> llen list
(integer) 4

删:

#删除key
127.0.0.1:6379> del teacher
(integer) 1
#从头部开始找,按先后顺序,值为a的元素,删除数量为2个,若存在第3个,则不删除
127.0.0.1:6379> lrem teacher 2 nfsnobody
(integer) 2
#从头开始,索引为0,1,2的3个元素,其余全部删除改
127.0.0.1:6379> ltrim teacher 0 2
OK

改:

#从头开始, 将索引为1的元素值,设置为新值 e,若索引越界,则返回错误信息
127.0.0.1:6379> lset teacher 1 test
OK
#将 teacher 中的尾部元素移到其头部
127.0.0.1:6379> rpoplpush teacher teacher
"nfsnobody"

查:

#列表头部弹出,弹一行少一行
127.0.0.1:6379> lpop teacher
"nfsnobody"
#列表尾部
127.0.0.1:6379> rpop teacher
"wang5"
#查询索引(头部开始)
127.0.0.1:6379> lindex list 0
"nfs"
#查询索引(尾部第一个)
127.0.0.1:6379> lindex list -1
"alex"
#范围查询索引
127.0.0.1:6379> lrange list 0 1
1) "nfs"
2) "nfsnobody"

微博、微信朋友圈场景实现:

#发朋友圈
127.0.0.1:6379> LPUSH wechat "monday,nfs is a bad man"
(integer) 1
127.0.0.1:6379> LPUSH wechat "Tuesday,nfsnobody is a nice boy"
(integer) 2
127.0.0.1:6379> LPUSH wechat "Wednesday,alex is a loser"
(integer) 3

#查看朋友圈内容
127.0.0.1:6379> LRANGE wechat 0 -1
1) "Wednesday,nfsnobody is a nice boy"
2) "Tuesday,nfsnobody is a nice boy"
3) "monday,nfsnobody is a nice boy"

set(集合)类型操作

应用场景:
> 在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

增:

#若key不存在,创建该键及与其关联的set,依次插入nfs、li、xiaomimei若key存在,则插入value中,若nfs在nfsnobody_fans中已经存在,则插入了li和xiaomimei两个新成员。
127.0.0.1:6379> sadd nfsnobody_fans nfs li xiaomimei
(integer) 3

删:

#尾部的b被移出,事实上b并不是之前插入的第一个或最后一个成员
127.0.0.1:6379> spop nfsnobody_fans
"nfs"
#若值不存在, 移出存在的值,并返回剩余值得数量
127.0.0.1:6379> SREM nfsnobody_fans li nfsnobody alex
(integer) 1

改:

#将小迷妹从 nfsnobody_fans 移到 nfs_fans
127.0.0.1:6379> SMOVE nfsnobody_fans nfs_fans xiaomimei
(integer) 1

查:

#判断xiaomimei是否已经存在,返回值为 1 表示存在
127.0.0.1:6379> SISMEMBER nfsnobody_fans xiaomimei
(integer) 0
127.0.0.1:6379> SISMEMBER nfs_fans xiaomimei
(integer) 1
#查看set中的内容
127.0.0.1:6379> SMEMBERS nfsnobody_fans
1) "xiaomimei"
2) "nfs"
3) "li"
#获取Set 集合中元素的数量
127.0.0.1:6379> scard nfsnobody_fans
(integer) 0
127.0.0.1:6379> scard nfs_fans
(integer) 1
#随机的返回某一成员
127.0.0.1:6379> srandmember nfs_fans
"xiaomimei"

#创建三个集合
127.0.0.1:6379> sadd nfsnobody_fans nfs li xiaomimei
(integer) 3
127.0.0.1:6379> sadd nfs_fans nfsnobody li xiaomimei
(integer) 2
127.0.0.1:6379> sadd li_fans 0
(integer) 1

#1和2得到一个结果,拿这个集合和3比较,获得每个独有的值
127.0.0.1:6379> sdiff nfsnobody_fans nfs_fans li_fans
1) "nfs"
#3个集和比较,获取独有的元素,并存入diffkey 关联的Set中
127.0.0.1:6379> sdiffstore diffkey nfsnobody_fans nfs_fans li_fans
(integer) 1
#获得3个集合中都有的元素
127.0.0.1:6379> sinter nfsnobody_fans nfs_fans li_fans
(empty list or set)    //因为这里没有交集,所以返回一个空集合
#把交集存入interkey 关联的Set中
127.0.0.1:6379> sinterstore interkey nfs_fans li_fans
(integer) 0  // 因为这里没有交集,所以存入的值为0
#获取3个集合中的成员的并集
127.0.0.1:6379> sunion nfsnobody_fans nfs_fans li_fans
1) "nfs"
2) "xiaomimei"
3) "nfsnobody"
4) "li"
5) "0"
#把并集存入unionkey 关联的Set中
127.0.0.1:6379> sunionstore unionkey nfsnobody_fans nfs_fans li_fans
(integer) 5

Sorted-Set(有序集合)类型操作

应用场景:
> 排行榜应用,取TOP N操作
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

增:

#添加两个分数分别是 2 和 3 的两个成员
127.0.0.1:6379> zadd myzset 2 "two" 3 "three"
(integer) 2

删:

#删除多个成员变量,返回删除的数量
127.0.0.1:6379> zrem myzset one two
(integer) 1

改:

#将成员 one 的分数增加 2,并返回该成员更新后的分数
127.0.0.1:6379> zincrby myzset 2 one
"2"

查:

#返回所有成员和分数,不加WITHSCORES,只返回成员
127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "one"
2) "2"
3) "three"
4) "3"
#获取成员one在Sorted-Set中的位置索引值。0表示第一个位置
127.0.0.1:6379> zrank myzset one
(integer) 0
#获取 myzset 键中成员的数量
127.0.0.1:6379> zcard myzset
(integer) 2
#获取分数满足表达式 1 <= score <= 2 的成员的数量
127.0.0.1:6379> zcount myzset 1 2
(integer) 1
#获取成员 three 的分数
127.0.0.1:6379> zscore myzset three
"3"
#获取分数满足表达式 1 < score <= 2 的成员
127.0.0.1:6379> zrangebyscore myzset  1 2
1) "one"
#-inf 表示第一个成员,+inf最后一个成员
#limit限制关键字
#2  3  是索引号
zrangebyscore myzset -inf +inf limit 2 3  返回索引是2和3的成员
#删除分数 1<= score <= 2 的成员,并返回实际删除的数量
127.0.0.1:6379> zremrangebyscore myzset 1 2
(integer) 1
#删除位置索引满足表达式 0 <= rank <= 1 的成员
127.0.0.1:6379> zremrangebyrank myzset 0 1
(integer) 1
#按位置索引从高到低,获取所有成员和分数
127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES
#原始成员:位置索引从小到大
one  0
two  1
#执行顺序:把索引反转
位置索引:从大到小
one 1
two 0
#输出结果:
two
one
#获取位置索引,为1,2,3的成员
127.0.0.1:6379> zrevrange myzset 1 3
(empty list or set)
#相反的顺序:从高到低的顺序
#获取分数 3>=score>=0的成员并以相反的顺序输出
127.0.0.1:6379> zrevrangebyscore myzset 3 0
(empty list or set)
#获取索引是1和2的成员,并反转位置索引
127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 2
(empty list or set)
标签:

您可能也喜欢:

Redis主从复制及高可用

Redis主从复制 Redis复制功能介绍 1)使用异步复制。 2)一个主服务器可以有多个从服务器。 3)从服务器也可以有自己的从服务器。 4)复制功能不会阻塞主服务器。 5)可以通过复制功能来让主服务器免于执行持久化操作,由从服务器去执行持久化操作即可。 Redis复制功能介绍(重点了解) 1...

more

Redis事务、锁、管理命令

事务介绍 Redis的事务与关系型数据库中的事务区别 1)在MySQL中讲过的事务,具有A、C、I、D四个特性 Atomic(原子性) > 所有语句作为一个单元全部成功执行或全部取消。 Consistent(一致性) > 如果数据库在事务开始时处于一致状态,则在执行该。
事务期间将保...

more

Redis消息队列

生产消费模型 什么是消息队列 在生活中,其实有很多的例子,都类似消息队列。 比如:工厂生产出来的面包,交给超市,商场来出售,客户通过超市,商场来买面包,客户不会针对某一个工厂去选择,只管从超市买出来,工厂也不会管是哪一个客户买了面包,只管生产出来之后,交给超市,商场来处理。 消息队列(Messa...

more

欢迎新朋友你的到来!
还没有人抢沙发呢~
昵称
邮箱
网站

切换注册

登录

忘记密码 ?

切换登录

注册