select num

数据库选择 默认有16[0到15]个数据库,默认自动选择0号数据库

move key num

移动key到num服务器

del key [key ...]

删除给定的一个或多个 key 。

exists key

检查给定 key 是否存在。

expire key

整型值 设置key的生命周期 单位秒数

如果为p(pexpire)单位就变为毫秒

expireat key timestamp

指定key在UNIX 时间戳(unix timestamp)变失效

KEYS pattern

查找所有符合给定模式 pattern 的 key 。

  • KEYS * 匹配数据库中所有 key 。
  • KEYS h?llo 通配单个字符 如 hello , hallo 和 hxllo 等。
  • KEYS h*llo 通配任意多个字符(包括没有) 如hllo 和 heeeeello 等。
  • KEYS h[ae]llo 通配括号内的某1个字符 如hello 和 hallo ,但不匹配 hillo 。

特殊符号用 \ 隔开。

ttl key

查询key的生命周期 默认-1,永久有效; 单位秒数 如果为(pttl)单位就变为毫秒

persist key

不让key失效;

randomkey

从当前数据库中随机返回(不删除)一个 key 。

rename key newkey

将 key 改名为 newkey 。

renamenx key newkey

当且仅当 newkey 不存在时,将 key 改名为 newkey 。

type key

返回 key 所储存的值的类型。

flushdb

清空当前数据库;

SORT与SCAN

这两个命令稍微复杂一点,所以单独拎出来讲

sort

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

如果要把redis作为noSql来用的话,该命令就是一个非常重要的命令了,作用有 分页,排序,数据关联

排序

按数值排序

# 开销金额列表
redis> LPUSH today_cost 30 1.5 10 8
(integer) 4 # 排序
redis> SORT today_cost
1) "1.5"
2) "8"
3) "10"
4) "30" # 逆序排序
redis 127.0.0.1:6379> SORT today_cost DESC
1) "30"
2) "10"
3) "8"
4) "1.5"

按字符串排序

必须显示的指定 alpha 选项才能进行排序,否则不能排序;

127.0.0.1:6379> SORT website
(error) ERR One or more scores can't be converted into double 127.0.0.1:6379> SORT website alpha
1) "www.alipay.com"
2) "www.baidu.com"
3) "www.china.com"
4) "www.sina.com"
5) "www.tence.com" 127.0.0.1:6379> SORT website alpha desc
1) "www.tence.com"
2) "www.sina.com"
3) "www.china.com"
4) "www.baidu.com"
5) "www.alipay.com"

limit

排序从0开始算

127.0.0.1:6379> SORT testnum  limit 5
(error) ERR syntax error 127.0.0.1:6379> SORT testnum limit 5 10
1) "5"
2) "6"
3) "8"
4) "9"
5) "10"
6) "11"
7) "24"

关联外部数据

# admin

redis 127.0.0.1:6379> LPUSH uid 1
(integer) 1 redis 127.0.0.1:6379> SET user_name_1 admin
OK redis 127.0.0.1:6379> SET user_level_1 9999
OK # jack redis 127.0.0.1:6379> LPUSH uid 2
(integer) 2 redis 127.0.0.1:6379> SET user_name_2 jack
OK redis 127.0.0.1:6379> SET user_level_2 10
OK # peter redis 127.0.0.1:6379> LPUSH uid 3
(integer) 3 redis 127.0.0.1:6379> SET user_name_3 peter
OK redis 127.0.0.1:6379> SET user_level_3 25
OK # mary redis 127.0.0.1:6379> LPUSH uid 4
(integer) 4 redis 127.0.0.1:6379> SET user_name_4 mary
OK redis 127.0.0.1:6379> SET user_level_4 70
OK
redis 127.0.0.1:6379> SORT uid
1) "1" # admin
2) "2" # jack
3) "3" # peter
4) "4" # mary # ↓↓ 根据外部的level来排序
redis 127.0.0.1:6379> SORT uid BY user_level_*
1) "2" # jack , level = 10
2) "3" # peter, level = 25
3) "4" # mary, level = 70
4) "1" # admin, level = 9999

user_level_* 是一个占位符, 它先取出 uid 中的值, 然后再用这个值来查找相应的键。

# 获取关联数据
127.0.0.1:6379> sort uid get user_name_*
1) "admin"
2) "jack"
3) "peter"
4) "mary" 127.0.0.1:6379> sort uid get user_name_* by user_level_*
1) "jack"
2) "peter"
3) "mary"
4) "admin" # 获取多个外部键
redis 127.0.0.1:6379> SORT uid GET user_level_* GET user_name_*
1) "9999" # level
2) "admin" # name
3) "10"
4) "jack"
5) "25"
6) "peter"
7) "70"
8) "mary" # 占位符 # 可以获得当前uid的值,这里由于markdown语法的问题,所以临时转义一下;
127.0.0.1:6379> sort uid desc get \# get user_level_* get user_name_*
1) "4"
2) "70"
3) "mary"
4) "3"
5) "25"
6) "peter"
7) "2"
8) "10"
9) "jack"
10) "1"
11) "999"
12) "admin"

根据 not-exists-key 可以忽略排序,感觉没什么用

redis 127.0.0.1:6379> SORT uid BY not-exists-key GET # GET user_level_* GET user_name_*
1) "4" # id
2) "70" # level
3) "mary" # name
4) "3"
5) "25"
6) "peter"
7) "2"
8) "10"
9) "jack"
10) "1"
11) "9999"
12) "admin"

关于哈希表的关联

BY 和 GET 选项都可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域;

redis 127.0.0.1:6379> HMSET user_info_1 name admin level 9999
OK redis 127.0.0.1:6379> HMSET user_info_2 name jack level 10
OK redis 127.0.0.1:6379> HMSET user_info_3 name peter level 25
OK redis 127.0.0.1:6379> HMSET user_info_4 name mary level 70
OK 127.0.0.1:6379> SORT uid get # get user_info_*->level by user_info_*->level desc
1) "1"
2) "9999"
3) "4"
4) "70"
5) "3"
6) "25"
7) "2"
8) "10"

保存sort结果

127.0.0.1:6379> SORT uid get # get user_info_*->name  by user_info_*->level desc store user_level_desc_name
(integer) 8
127.0.0.1:6379> EXPIRE user_level_desc_name 60
(integer) 1

可以通过将 SORT 命令的执行结果保存,并用 EXPIRE 为结果设置生存时间,以此来产生一个 SORT 操作的结果缓存。

这样就可以避免对 SORT 操作的频繁调用:只有当结果集过期时,才需要再调用一次 SORT 操作。

另外,为了正确实现这一用法,你可能需要加锁以避免多个客户端同时进行缓存重建(也就是多个客户端,同一时间进行 SORT 操作,并保存为结果集),这一般是用在数据量较大的时候,在程序里面做如下操作:

  1. 先判断 user_level_desc_name 有没有;如果有就直接取出;
  2. 如果没有,然后用setnx加个锁(时间具体看数据大小,或者建立完缓存再让其失效),来建立缓存(这时如果有其他进程访问,就会判断到有这个锁就不建立缓存),然后返回数据;

以上参考: http://doc.redisfans.com/key/sort.html

scan

SCAN cursor [MATCH pattern] [COUNT count]

SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements):

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。这时候就要选择用 SCAN 命令了。

使用 SMEMBERS 命令可以返回集合键当前包含的所有元素, 但是对于 SCAN 这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 (offer limited guarantees about the returned elements)。

SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。而 SCAN 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。

redis 127.0.0.1:6379> scan 0
1) "17" # 当前迭代的游标到17
2) 1) "key:12"
2) "key:8"
3) "key:4"
4) "key:14"
5) "key:16"
6) "key:17"
7) "key:15"
8) "key:10"
9) "key:3"
10) "key:7"
11) "key:1" redis 127.0.0.1:6379> scan 17
1) "0" # 然后从17开始继续迭代,迭代到0就代表迭代结束,它会自动rewind;
2) 1) "key:5"
2) "key:18"
3) "key:0"
4) "key:2"
5) "key:19"
6) "key:13"
7) "key:6"
8) "key:9"
9) "key:11" # 也可以通过count来限制每次迭代的数量,注意,在每次迭代时这个count的值可以不一样;
127.0.0.1:6379> scan 0 count 5
1) "28"
2) 1) "member1"
2) "user_info_1"
3) "user_name_3"
4) "user_level_4"
5) "coll"

使用MATCH 选项

通过给定 MATCH 参数可以实现 keys 那样的按模式迭代;但是,这里的按模式迭代和keys有一些本质上的区别:

对元素的模式匹配工作是在命令从数据集中取出元素之后, 向客户端返回元素之前的这段时间内进行的, 所以如果被迭代的数据集中只有少量元素和模式相匹配, 那么迭代命令或许会在多次执行中都不返回任何元素。

redis 127.0.0.1:6379> scan 224 MATCH *11*
1) "80"
2) (empty list or set) redis 127.0.0.1:6379> scan 80 MATCH *11*
1) "176"
2) (empty list or set) redis 127.0.0.1:6379> scan 176 MATCH *11* COUNT 1000
1) "0"
2) 1) "key:611"
2) "key:711"
3) "key:118"
4) "key:117"
5) "key:311"
6) "key:112"
7) "key:111"
8) "key:110"
9) "key:113"
10) "key:211"
11) "key:411"
12) "key:115"
13) "key:116"
14) "key:114"
15) "key:119"
16) "key:811"
17) "key:511"
18) "key:11"

更多请参考: http://doc.redisfans.com/key/index.html

【redis专题(8)】命令语法介绍之通用KEY的更多相关文章

  1. 【redis专题(7)】命令语法介绍之Pub/Sub

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.p ...

  2. 【redis专题(2)】命令语法介绍之string

    REDIS有5大数据结构:string,link,sortedset,sets,hash. 这5个结构我将用5篇文章来记录各自是怎么用的,然后再用一篇文章来说一下各自的应用场景: 更多语法请参考: h ...

  3. 【redis专题(6)】命令语法介绍之hash

    可以把hash看做一个数组hset array key1 value2;,该数据类型特别适用于存储 增 hset key field value 作用: 把key中filed域的值设为value 注: ...

  4. 【redis专题(5)】命令语法介绍之sets

    标签(空格分隔): Redis 关于 redis的无序集合有三个特点: 无序性, 确定性(描述准确) , 唯一性: 有点类似于数据容器: 增 SADD key member1 [member2] 作用 ...

  5. 【redis专题(4)】命令语法介绍之sorted_set

    有序集合可以模拟优先级队列的实现 增 zadd key score1 value1 score2 value2 .. redis 127.0.0.1:6379> zadd stu 18 lily ...

  6. 【redis专题(3)】命令语法介绍之link

    通过链表结构可以模仿队列结构与堆栈结构:关于队列结构和堆栈结构可以查看https://www.zybuluo.com/a5635268/note/290475 增 lpush key value1 v ...

  7. Jedis对Redis的常用命令操作

    本篇主要总结一些Jedis对Redis的常用命令操作: 1.对key操作命令 2.对String操作命令 3.对List操作命令 4.对Set操作命令 5.对Hash操作命令 6.排序操作指令 一.项 ...

  8. redis学习笔记01 — 基本介绍、安装配置及常用命令

    redis--NoSQL的一种 为了解决高并发.高可用.高扩展.大数据存储等一系列问题而产生的数据库解决方案,就是NoSQL NoSQL,非关系型数据库,全名:Not Only Sql,它不能代替关系 ...

  9. redis GEO地理位置命令介绍

    GEOADD keylongitude latitude member [longitude latitude member ...] Available since 3.2.0. Time comp ...

随机推荐

  1. 使用PHP生成二维码(PHPQRCode)

    关于什么是二维码,可以阅读 http://baike.baidu.com/view/132241.htm 这里就不多讲了,二维码的应用非常广泛,似乎一夜之间渗透到我们生活的方方面面,地铁广告.报纸.火 ...

  2. vue移动端框架到底哪家强

    Weex 2016年4月21日,阿里巴巴在Qcon大会上宣布跨平台移动开发工具Weex开放内测邀请. Weex 是一套简单易用的跨平台开发方案,能以 web 的开发体验构建高性能.可扩展的 nativ ...

  3. SQLServer提取日期中的年月日及其他格式

    提取年:datepart(yy,getdate())提取月:datepart(mm,getdate())提取日:datepart(dd,getdate())提取日期格式:Select CONVERT( ...

  4. WeMall微商城源码投票插件Vote的主要源码

    WeMall微信商城源码投票插件Vote,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace Ad ...

  5. tomcat升级,tomcat窗体改名,一台电脑安装多版本JDK

    1 tomcat改名:在bin目录下找到次文件(如图),按图上指示修改(比如我窗体是主数据) 修改后: 2 一台电脑安装多个版本的JDK 为什么我们要安装多个版本JDK?--我是因为tomcat修复漏 ...

  6. 理解云计算的(IaaS PaaS SaaS)

    本文不经允许,不得转载! 云计算技术已经慢慢普及了.我们做技术的有必要学习云计算技术. IaaS:Infrastructure-as-a-Service(基础设施即服务)云计算到来之前,很多企业都是自 ...

  7. JavaWeb之Filter过滤器

    原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功 ...

  8. ES4:ElasticSearch 使用C#添加和更新文档

    这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:ElasticSearch 集群配置 第三篇:ES3:Ela ...

  9. 关于EasyUI 1.5版Datagrid组件在空数据时无法显示"空记录"提示的BUG解决方法

    问题:jQuery easyUI中Datagrid,在表格数据加载无数据的时候,如何显示"无记录"的提示语? 解决jQuery EasyUI 1.5.1版本的Datagrid,在处 ...

  10. El表达式的用法个人总结

    EL表达式的好处: 通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性. EL表达式的几个特点:  1:可以与jsp标签库结合使用,也可以与javascript语 ...