8 Redis 数据库管理

1.处理数据库的单个键

type   key_name  //命令用于返回 key 所储存的值的类型。

del  key_name  // 命令用于删除已存在的键。不存在的 key 会被忽略。

exists  key_name   //查看键是否存在于数据库中

rename  oldKey newKey //键重命名

renamenx   name name1  //重命名失败,只有当name1不存在才能改名

 

2.对键的值进行排序

redis支持对list,set,sorted set、hash元素(元素可以为数值与字符串)的排序。

sort 排序命令格式:

sort key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey] 

1 sort key (list)

这是最简单的情况,没有任何选项对集合自身元素排序并返回排序结果,默认为value升序。

2 sort key [ASC|DESC] [ALPHA]  (list)

sort默认的排序方式(asc)是从小到大排的,当然也可以按照逆序或者按字符顺序排。

逆序可以加上desc选项,想按字母顺序排可以加alpha选项,alpha可以和desc一起用。

sort 默认以分数(数值)排序,字母使用默认的sort排序,会报错!

 

排序的一些问题。

   如果有多个redis server的话,不同的key可能存在于不同的server上。比如mimvp_12, mimvp_11,mimvp_13,mimvp_10,很有可能分别在四个不同的server上存贮着,这种情况会对排序性能造成很大的影响。

   redis作者在他的blog上提到了这个问题的解决办法,就是通过key tag将需要排序的key都放到同一个server上 。由于具体决定哪个key存在哪个服务器上一般都是在client端hash的办法来做的,我们可以通过只对key的部分进行hash

举个例子:

       假如我们 的client如果发现key中包含[],那么只对key中[]包含的内容进行hash,我们将四个name相关的key,都这样命名[name]12 [name]13 [name]11 [name]10,于是client 程序就会把他们都放到同一server上(不知道jredis实现了没)。

还有一个问题也比较严重

        如果要sort的集合非常大的话排序就会消耗很长时间。由于redis单线程的,所以长时间的排序操作会阻塞其他client的 请求。解决办法是通过主从复制机制将数据复制到多个slave上。然后我们只在slave上做排序操作,并尽可能的对排序结果缓存。另外就是一个方案是就是采用sorted set对需要按某个顺序访问的集合建立索引。

 

 

3.获取数据库包含的键

randomkey    //返回随机键

keys 键全量遍历:

keys  * //返回所有的键, *匹配任意字符多个字符
keys *y //以结尾的键, 
keys n*e //以n开头以e结尾,返回name
keys n?me  //  ?问号代表只匹配一个字符  返回name,全局匹配 
keys n?m*   //返回name
keys [j,l]*  //返回以j l开头的所有键  keys [j]ames 全量匹配james

考虑到是单线程, 在生产环境不建议使用,如果键多可能会阻塞,如果键少,可以

scan  渐进式遍历

scan 0 match l* count 100 //匹配以n开头的键,取20条,第一次scan 0开始

第二次从游标10开始取20个以n开头的键,相当于一页一页的取,当最后返回0时,键被取完

注:渐进式遍历可有效地解决keys命令可能产生的阻塞问题
除scan字符串外:还有以下
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
用法和scan一样

4.对数据库本身进行操作

dbsize  查看当前数据库 key 的个数

flushdb    只清空当前数据库的键值对 dbsize 0

select  index      切换数据

move key db  //把部分数据迁移到另一台redis服务器 reids有16个库, 编号为0-15           

flushall    清空所有库的键值对

 

5 键过期

expire name:lin 30 //键name:03 在30秒后过期
ttl name:lin //查看过期按秒到计时,当返回-2说明已删除
pttl name:lin //查看过期按毫秒到时计
set name:05 james //初始化数据
pexpire name:05 20000 //20000毫秒(20S)后过期
expire name:06 -2 //直接过期,和del一样


设置键在某个时间点过期 使用的是时间戳
expireat name:04 1516971599 //设置在2018/01/27 20:59:59过期
 

hset user:01 name james //初始化数据
expire user:01 60 //设置60S后过期
ttl user:01 //查看过期剩余时间
persist user:01 //去掉过期
ttl user:1 //返回-1 可以永久查询不失效

注意:对于字符串重设值后,expire无效,
set name james
expire name 50
ttl name
set name james1 //此时expire取消
ttl name //返回-1, 长期有效

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值