看到你们都须要redis,而我工做却没怎么接触过,特来学习,如今先熟悉指令,我经过redis中文的 互动教程(interactive tutorial)来学习的。html
#查看全部key keys * 或 keys "*" #查看匹配前缀的keys keys "miao*" #清空redis flushdb #随机取出一个key randomkey #查看key的类型 type key #查看数据库中key的数量 dbsize #查看服务器信息 info #查看redis正在作什么 monitor #查看日志
slowlog get slowlog get 10
经过set key value来存储,经过get key来获取值java
set key value:设置key的值,若存在则覆盖 setnx key value:SET if Not eXists,若存在则不操做。 MSET key1 value1 key2 value2 ... keyN valueN:设置这些key的值,若存在则覆盖 MSETNX key1 value1 key2 value2 ... keyN valueN:同mset,但若是其中一个key已经存在了,则都不设置。这些操做都是原子的。 rename key: 重命名 append key value:向key的字符串追加拼接。
get key:获取key对应的值 MGET key1 key2 ... keyN:获取这些key对应的值
EXISTS key:查看是否存在该元素。 GETSET key value:获取该元素的值,并给该元素设置新值。(一般和incr搭配使用,好比一个mycount一直incr,而后达到某些状况须要清零,清零以前须要知道mycount的值). del key:删除元素 RENAME oldkey newkey:重命名
incr key:原子的+1; DECR key:原子的-1; DECRBY key integer:原子的-integer; INCRBY key integer:原子的+integer
expire key 多少秒:设置多少秒后过时; ttl key:Time To Live,查看还能够存活多久,-2表示key不存在;-1表示定时任务消失,永久存储。web
EXPIRE key seconds:设置该元素多少秒后失效 PEXPIRE key milliseconds:设置该元素多少毫秒后失效 TTL key:查看还能够存活多少秒,-2表示key不存在,-1表示永久存储 SETEX key seconds value:等价于先设置变量再设置超时,即在缓存中使用:存储的同时设置超时时间,这个操做是原子的 persist key:取消过时时间 expireat key 时间戳:unix时间戳,1970.1.1以后,这个绝对时间,将在这个时间删除key。SETEX KEY_NAME TIMEOUT VALUE:设置key的值为value,并在timeout秒后失效,key将被删除expireat pages:about 1356933600:在2012年12月31日上午12点删除掉关键字
->
->
->
redis
rpush keyList value:向keyList添加元素,向后加,r表示右边 lpush keyList value:向keyList左边添加元素,LPUSH puts the new value at the start of the list. lrange keyList beginIndex endIndex:获取keyList的元素,用两端的索引取出子集,endIndex=-1则表示所有取出
这里就要了解redis数据结构的存储类型, 字符串(strings), 散列(hashes), 列表(lists),集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions) 和不一样级别的 磁盘持久化(persistence), 并经过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。sql
如今学习list:数据库
->
->
->
缓存
llen keyList :获取keyList的长度大小 lpop keyList:取出并移除keyList第一个元素,左边的元素 rpop keyList:取出并移除keyList最后一个元素,右边的元素 LINDEX key index:获取该索引下的元素。 lrem key count value:删除count个value。(count为正数,从头开始,删除count个value元素;count为负,则从尾部向头删除|count|个value元素;count为0,则全部的元素为value的都删除) LSET key index value:设置索引为index下的元素为value.超出索引范围报错。 LTRIM key start end:清空索引在start 和end以外的元素,索引从0开始,两端保留,两端以外的清空。 RPOPLPUSH srckey dstkey:源队列srckey,目标队列dstkey,将srckey的最后一个移除,并放到dstkey的第一个。
-》
-》
服务器
和java中list与set的区别同样。这里的set无序且值惟一。数据结构
The next data structure that we'll look at is a set. A set is similar to a list, except it does not have a specific order and each element may only appear once. Some of the important commands in working with sets are SADD, SREM, SISMEMBER, SMEMBERS and SUNION.多线程
sadd key value : 向set添加元素 srem key value :从set中移除元素 smembers key : 取出全部set元素 SISMEMBER key value: 查看value是否存在set中 SUNION key1 key2 ... keyN:将全部key合并后取出来,相同的值只取一次 scard key : 获取set中元素的个数 SRANDMEMBER key: Return a random element from a Set, without removing the element.随机取出一个 SDIFF key1 key2 ... keyN:获取第一set中不存在后面几个set里的元素。 SDIFFSTORE dstkey key1 key2 ... keyN:和sdiff相同,获取key1中不存在其余key里的元素,但要存储到dstkey中。 SINTER key1 key2 ... keyN:取出这些set的交集 SINTERSTORE dstkey key1 key2 ... keyN:取出这些key的交集并存储到dstkey SMOVE srckey dstkey member:将元素member从srckey中转移到dstkey中,这个操做是原子的。
-》
-》
-》
和set同样,惟一。但z多了个score用来排序。因此命令又像list同样:
ZADD key score member:向有序set中添加元素member,其中score为分数,默认升序; ZRANGE key start end [WITHSCORES]:获取按score从低到高索引范围内的元素,索引能够是负数,-1表示最后一个,-2表示倒数第二个,即从后往前。withscores可选,表示获取包括分数。 ZREVRANGE key start end [WITHSCORES]:同上,但score从高到低排序。 ZCOUNT key min max:获取score在min和max范围内的元素的个数 ZCARD key:获取集合中元素的个数。 ZINCRBY key increment member:根据元素,score原子增长increment. ZREMRANGEBYSCORE key min max:清空集合内的score位于min和max之间的元素。 ZRANK key member:获取元素的索引(照score从低到高排列)。 ZREM key member:移除集合中的该元素 ZSCORE key member:获取该元素的score
能够存储对象,好比人,编号,姓名,年龄等
HSET key field value:key是对象名,field是属性,value是值; HMSET key field value [field value ...]:同时设置多个属性 HGET key field:获取该对象的该属性 HMGET key field value [field value ...]:获取多个属性值 HGETALL key:获取对象的全部信息 HKEYS key:获取对象的全部属性 HVALS key:获取对象的全部属性值 HDEL key field:删除对象的该属性 HEXISTS key field:查看对象是否存在该属性 HINCRBY key field value:原子自增操做,只能是integer的属性值可使用; HLEN key: Return the number of entries (fields) contained in the hash stored at key.获取属性的个数。
->
->
文档以下:
SORT key [BY pattern] [LIMIT startcount] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey]
DESCRIPTION: Sort the elements contained in the List, Set, or Sorted Set value at key. By default sorting is numeric with elements being compared as double precision floating point numbers. This is the simplest form of SORT: SORT mylist
Assuming mylist contains a list of numbers, the return value will be the list of numbers ordered from the smallest to the biggest number. In order to get the sorting in reverse order use DESC: SORT mylist DESC
The ASC option is also supported but it's the default so you don't really need it. If you want to sort lexicographically use ALPHA. Note that Redis is utf-8 aware assuming you set the right value for the LC_COLLATE environment variable.
Sort is able to limit the number of returned elements using the LIMIT option: SORT mylist LIMIT 0 10
In the above example SORT will return only 10 elements, starting from the first one (start is zero-based). Almost all the sort options can be mixed together. For example the command: SORT mylist LIMIT 0 10 ALPHA DESC
Will sort mylist lexicographically, in descending order, returning only the first 10 elements.
Sometimes you want to sort elements using external keys as weights to compare instead to compare the actual List Sets or Sorted Set elements. For example the list mylist may contain the elements 1, 2, 3, 4, that are just unique IDs of objects stored at object_1, object_2, object_3 and object_4, while the keys weight_1, weight_2, weight_3 and weight_4 can contain weights we want to use to sort our list of objects identifiers. We can use the following command:
SORTING BY EXTERNAL KEYS:
SORT mylist BY weight_*
the BY option takes a pattern (weight_* in our example) that is used in order to generate the key names of the weights used for sorting. Weight key names are obtained substituting the first occurrence of * with the actual value of the elements on the list (1,2,3,4 in our example).
Our previous example will return just the sorted IDs. Often it is needed to get the actual objects sorted (object_1, ..., object_4 in the example). We can do it with the following command:
RETRIEVING EXTERNAL KEYS:
SORT mylist BY weight* GET object*
Note that GET can be used multiple times in order to get more keys for every element of the original List, Set or Sorted Set sorted.
Since Redis >= 1.1 it's possible to also GET the list elements itself using the special # pattern: SORT mylist BY weight* GET object* GET #
STORING THE RESULT OF A SORT OPERATION:
By default SORT returns the sorted elements as its return value. Using the STORE option instead to return the elements SORT will store this elements as a Redis List in the specified key. An example:SORT mylist BY weight_* STORE resultkey
An interesting pattern using SORT ... STORE consists in associating an EXPIRE timeout to the resulting key so that in applications where the result of a sort operation can be cached for some time other clients will use the cached list instead to call SORT for every request. When the key will timeout an updated version of the cache can be created using SORT ... STORE again.
Note that implementing this pattern it is important to avoid that multiple clients will try to rebuild the cached version of the cache at the same time, so some form of locking should be implemented (for instance using SETNX).
RETURN VALUE: A multi bulk reply containing a list of sorted elements.
复制一个sort的用法:http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135921.html
返回或保存给定列表、集合、有序集合key中通过排序的元素。排序默认以数字做为对象,值被解释为双精度浮点数,而后进行比较。
最简单的sort使用方法是sort key和sort key desc。
sort key:返回键值从小到大排序的结果。
sort key desc:返回键值从大到小排序的结果。
假设price列表保存了今日的物品价格, 那么能够用sort命令对它进行排序:
# 开销金额列表
redis> lpush price 30 1.5 10 8 (integer) 4
# 排序
redis> sort price 1) "1.5" 2) "8" 3) "10" 4) "30"
# 逆序排序
redis 127.0.0.1:6379> sort price desc 1) "30" 2) "10" 3) "8" 4) "1.5"
9.3 使用alpha修饰符对字符串进行排序
由于sort命令默认排序对象为数字,当须要对字符串进行排序时,须要显式地在sort命令以后添加alpha修饰符。
# 网址
redis> lpush website "www.ceddit.com" (integer) 1 redis> lpush website "www.hlashdot.com" (integer) 2 redis> lpush website "www.bnfoq.com" (integer) 3
# 默认(按数字)排序
redis 127.0.0.1:8888> sort website 1) "www.bnfoq.com" 2) "www.hlashdot.com" 3) "www.ceddit.com"
# 按字符排序
redis 127.0.0.1:8888> sort website alpha 1) "www.bnfoq.com" 2) "www.ceddit.com" 3) "www.hlashdot.com" redis 127.0.0.1:8888> sort website alpha desc 1) "www.hlashdot.com" 2) "www.ceddit.com" 3) "www.bnfoq.com"
9.四、使用limit修饰符限制返回结果
排序以后返回元素的数量能够经过limit修饰符进行限制,修饰符接受offset和count两个参数。offset:指定要跳过的元素数量,即起始位置。count:指定跳过offset个指定的元素以后,要返回多少个对象。
如下例子返回排序结果的前5个对象(offset为0表示没有元素被跳过)。
# 添加测试数据,列表值为1~10
redis 127.0.0.1:6379> rpush age 1 3 5 7 9 (integer) 5 redis 127.0.0.1:6379> rpush age 2 4 6 8 10 (integer) 10
# 返回列表中最小的5个值
redis 127.0.0.1:6379> sort age limit 0 5 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
9.五、使用外部key进行排序
可使用外部 key 的数据做为权重,代替默认的直接对比键值的方式来进行排序。
假设如今有用户数据以下:
如下代码将数据输入到redis中:
View Code
9.六、by选项
默认状况下, sort uid直接按uid中的值排序:
redis 127.0.0.1:6379> sort uid 1) "1" # admin 2) "2" # jack 3) "3" # peter 4) "4" # mary
经过使用by选项,可让uid按其余键的元素来排序。
好比说, 如下代码让uid键按照user_level_{uid}的大小来排序:
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中的值,而后再用这个值来查找相应的键。
好比在对uid列表进行排序时,程序就会先取出uid的值一、二、三、4,而后使用user_level_一、user_level_二、user_level_3和 user_level_4的值做为排序uid的权重。
9.七、get选项
使用get选项,能够根据排序的结果来取出相应的键值。
好比说,如下代码先排序uid,再取出键user_name_{uid}的值:
redis 127.0.0.1:6379> sort uid get user_name_* 1) "admin" 2) "jack" 3) "peter" 4) "mary"
如今的排序结果要比只使用 sort uid by user_level_* 要直观得多。
9.八、获取多个外部键
能够同时使用多个get选项,获取多个外部键的值。
如下代码就按 uid 分别获取 user_level_{uid} 和 user_name_{uid} :
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"
get有一个额外的参数规则,那就是能够用#获取被排序键的值。
如下代码就将 uid 的值、及其相应的 user_level_* 和 user_name_* 都返回为结果:
redis 127.0.0.1:6379> sort uid get # get user_level_* get user_name_* 1) "1" # uid 2) "9999" # level 3) "admin" # name 4) "2" 5) "10" 6) "jack" 7) "3" 8) "25" 9) "peter" 10) "4" 11) "70" 12) "mary"
9.九、获取外部键,但不进行排序
经过将一个不存在的键做为参数传给 by 选项, 可让 sort 跳过排序操做,直接返回结果:
redis 127.0.0.1:6379> sort uid by not-exists-key 1) "4" 2) "3" 3) "2" 4) "1"
这种用法在单独使用时,没什么实际用处。
不过,经过将这种用法和get选项配合,就能够在不排序的状况下,获取多个外部键,至关于执行一个整合的获取操做(相似于 sql数据库的join关键字)。
如下代码演示了,如何在不引发排序的状况下,使用sort、by和get获取多个外部键:
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"
9.十、将哈希表做为get或by的参数
除了能够将字符串键以外, 哈希表也能够做为 get 或 by 选项的参数来使用。
好比说,对于前面给出的用户信息表:
咱们能够不将用户的名字和级别保存在 user_name_{uid} 和 user_level_{uid} 两个字符串键中, 而是用一个带有 name 域和 level 域的哈希表 user_info_{uid} 来保存用户的名字和级别信息:
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
以后, by 和 get 选项均可以用 key->field 的格式来获取哈希表中的域的值, 其中 key 表示哈希表键, 而 field 则表示哈希表的域:
redis 127.0.0.1:6379> sort uid by user_info_*->level 1) "2" 2) "3" 3) "4" 4) "1" redis 127.0.0.1:6379> sort uid by user_info_*->level get user_info_*->name 1) "jack" 2) "peter" 3) "mary" 4) "admin"
9.十一、保存排序结果
默认状况下, sort 操做只是简单地返回排序结果,并不进行任何保存操做。
经过给 store 选项指定一个 key 参数,能够将排序结果保存到给定的键上。
若是被指定的 key 已存在,那么原有的值将被排序结果覆盖。
# 测试数据
redis 127.0.0.1:6379> rpush numbers 1 3 5 7 9 (integer) 5 redis 127.0.0.1:6379> rpush numbers 2 4 6 8 10 (integer) 10 redis 127.0.0.1:6379> lrange numbers 0 -1 1) "1" 2) "3" 3) "5" 4) "7" 5) "9" 6) "2" 7) "4" 8) "6" 9) "8" 10) "10" redis 127.0.0.1:6379> sort numbers store sorted-numbers (integer) 10 # 排序后的结果 redis 127.0.0.1:6379> lrange sorted-numbers 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 8) "8" 9) "9" 10) "10"
没有使用 store 参数,返回列表形式的排序结果。
使用 store 参数,返回排序结果的元素数量。
redis内置了不少原子操做的命令,好比incr,getset等,但实际中咱们但愿将一组命令原子的执行,这时候就须要用到事物。作法以下:
- 使用关键字multi
- 输入你想要的命令组合
- 输入exec来执行,或discard来放弃
127.0.0.1:6379> multi OK 127.0.0.1:6379> keys * QUEUED 127.0.0.1:6379> set miao "transaction is by using multi then do some order,end with exec" QUEUED 127.0.0.1:6379> get miao QUEUED 127.0.0.1:6379> get users:9001 QUEUED 127.0.0.1:6379> exec 1) 1) "friends:duncan" 2) "users:lookup:email" 3) "users:9001" 2) OK 3) "transaction is by using multi then do some order,end with exec" 4) "{id:9001,email:leto@dune.gov,..}"