命令參考文档:redis commands

你或许已经知道Redis并非简单的key-value存储。实际上他是一个数据结构server。支持不同类型的值。

也就是说。你不必只把字符串当作键所指向的值。

下列这些数据类型都可作为值类型。

  • 二进制安全的 字符串 string
  • 二进制安全的 字符串列表 list of
    string
  • 二进制安全的 字符串集合 set of
    string,换言之:它是一组无反复未排序的element。

    能够把它看成Ruby中的 hash–其key等于element。value都等于’true‘。

  • 有序集合sorted set of string。类似于集合set,但当中每一个元素都和一个浮点数score(评分)关联。

    element依据score排序。

    能够把它看成Ruby中的 hash–其key等于element,value等于score。但元素总是按score的顺序排列,无需额外的排序操作。

Redis 键

Redis key值是二进制安全的,这意味着能够用不论什么二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都能够。

空字符串也是有效key值。

关于key的几条规则:

  • 太长的键值不是个好主意,比如1024字节的键值就不是个好主意。不仅由于消耗内存,并且在数据中查找这类键值的计算成本非常高。
  • 太短的键值通常也不是好主意,假设你要用”u:1000:pwd”来取代”user:1000:password”。这没有什么问题,但后者更易阅读,并且由此添加的空间消耗相对于key object和value object本身来说非常小。

    当然。没人阻止您一定要用更短的键值节省一丁点儿空间。

  • 最好坚持一种模式。比如:”object-type:id:field”就是个不错的注意,像这样”user:1000:password”。

    我喜欢对多单词的字段名中加上一个点,就像这样:”comment:1234:reply.to”。

字符串类型

这是最简单Redis类型。假设你仅仅用这样的类型,Redis就像一个能够持久化的memcachedserver(注:memcache的数据仅保存在内存中。server重新启动后,数据将丢失)。

我们来玩儿一下字符串类型:

$ redis-cli set mykey "my binary safe value"
OK
$ redis-cli get mykey
my binary safe value

正如你所见到的,通经常使用SET command 和 GET
command
来设置和获取字符串值。

值能够是不论什么种类的字符串(包含二进制数据),比如你能够在一个键下保存一副jpeg图片。值的长度不能超过1GB。

尽管字符串是Redis的基本值类型,但你仍然能通过它完毕一些有趣的操作。比如:原子递增:

$ redis-cli set counter 100
OK $ redis-cli incr counter
(integer) 101
$ redis-cli incr counter
(integer) 102
$ redis-cli incrby counter 10
(integer) 112

INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,类似的命令有INCRBYDECR and DECRBY

实际上他们在内部就是同一个命令,仅仅是看上去有点儿不同。

INCR是原子操作意味着什么呢?就是说即使多个client对同一个key发出INCR命令,也决不会导致竞争的情况。

比如例如以下情况永远不可能发生:『client1和client2同一时候读出“10”。他们俩都对其加到11,然后将新值设置为11』。终于的值一定是12,read-increment-set操作完毕时,其它client不会在同一时间运行不论什么命令。

对字符串,还有一个的令人感兴趣的操作是GETSET命令。行如其名:他为key设置新值而且返回原值。这有什么用处呢?比如:你的系统每当有新用户訪问时就用INCR命令操作一个Redis
key。你希望每小时对这个信息收集一次。你就能够GETSET这个key并给其赋值0并读取原值。

列表类型

要说清楚列表数据类型,最好先讲一点儿理论背景,在信息技术界List这个词经常被使用不当。

比如”Python Lists”就名不副实(名为Linked Lists),但他们实际上是数组(相同的数据类型在Ruby中叫数组)

一般意义上讲,列表就是有序元素的序列:10,20,1,2,3就是一个列表。但用数组实现的List和用Linked List实现的List,在属性方面大不同样。

Redis lists基于Linked Lists实现。这意味着即使在一个list中有数百万个元素。在头部或尾部加入一个元素的操作。其时间复杂度也是常数级别的。用LPUSH 命令在十个元素的list头部加入新元素,和在千万元素list头部加入新元素的速度同样。

那么,坏消息是什么?在数组实现的list中利用索引訪问元素的速度极快。而相同的操作在linked list实现的list上没有那么快。

Redis Lists are implemented with linked lists because for a database system it is crucial to be able to add elements to a very long list in a very fast way. Another strong advantage is, as you’ll see in a moment, that Redis Lists can be taken at constant length
in constant time.

Redis Lists用linked list实现的原因是:对于数据库系统来说。至关重要的特性是:能非常快的在非常大的列表上加入元素。还有一个重要因素是,正如你将要看到的:Redis lists能在常数时间取得常数长度。

Redis lists 入门

LPUSH 命令可向list的左边(头部)加入一个新元素。而RPUSH命令可向list的右边(尾部)加入一个新元素。最后LRANGE 命令可从list中取出一定范围的元素

$ redis-cli rpush messages "Hello how are you?"
OK
$ redis-cli rpush messages "Fine thanks. I‘m having fun with Redis"
OK
$ redis-cli rpush messages "I should look into this NOSQL thing ASAP"
OK
$ redis-cli lrange messages 0 2
1. Hello how are you? 2. Fine thanks. I‘m having fun with Redis
3. I should look into this NOSQL thing ASAP

注意LRANGE 带有两个索引,一定范围的第一个和最后一个元素。这两个索引都能够为负来告知Redis从尾部開始计数,因此-1表示最后一个元素。-2表示list中的倒数第二个元素。以此类推。

As you can guess from the example above, lists can be used, for instance, in order to implement a chat system. Another use is as queues in order to route messages between different processes. But the key point is that you can use Redis lists every time you
require to access data in the same order they are added. This will not require any SQL ORDER BY operation, will be very fast, and will scale to millions of elements even with a toy Linux box.

正如你能够从上面的样例中猜到的,list可被用来实现聊天系统。

还能够作为不同进程间传递消息的队列。关键是,你能够每次都以原先加入的顺序訪问数据。

这不须要不论什么SQL ORDER BY 操作,将会非常快,也会非常easy扩展到百万级别元素的规模。

比如在评级系统中。比方社会化新闻站点 reddit.com,你能够把每一个新提交的链接加入到一个list。用LRANGE可简单的对结果分页。

在博客引擎实现中,你可为每篇日志设置一个list,在该list中推入进博客评论。等等。

向Redis list压入ID而不是实际的数据

在上面的样例里 ,我们将“对象”(此例中是简单消息)直接压入Redis list,但通常不应这么做,因为对象可能被多次引用:比如在一个list中维护其时间顺序。在一个集合中保存它的类别,仅仅要有必要。它还会出如今其它list中。等等。

让我们回到reddit.com的样例,将用户提交的链接(新闻)加入到list中。有更可靠的方法例如以下所看到的:

$ redis-cli incr next.news.id
(integer) 1
$ redis-cli set news:1:title "Redis is simple"
OK
$ redis-cli set news:1:url "http://code.google.com/p/redis"
OK
$ redis-cli lpush submitted.news 1
OK

我们自增一个key,非常easy得到一个独一无二的自增ID,然后通过此ID创建对象–为对象的每一个字段设置一个key。

最后将新对象的ID压入submitted.news list。

这仅仅是牛刀小试。在命令參考文档中能够读到全部和list有关的命令。你能够删除元素。旋转list。依据索引获取和设置元素,当然也能够用LLEN得到list的长度。

Redis 集合

Redis集合是未排序的集合,其元素是二进制安全的字符串。SADD命令能够向集合加入一个新元素。和sets相关的操作也有很多,比方检測某个元素是否存在,以及实现交集,并集,差集等等。

一例胜千言:

$ redis-cli sadd myset 1
(integer) 1
$ redis-cli sadd myset 2
(integer) 1
$ redis-cli sadd myset 3
(integer) 1
$ redis-cli smembers myset
1. 3
2. 1
3. 2

我向集合中加入了三个元素,并让Redis返回全部元素。如你所见它们是无序的。

如今让我们检查某个元素是否存在:

$ redis-cli sismember myset 3
(integer) 1
$ redis-cli sismember myset 30
(integer) 0

“3″是这个集合的成员。而“30”不是。集合特别适合表现对象之间的关系。

比如用Redis集合能够非常easy实现标签功能。

以下是一个简单的方案:对每一个想加标签的对象,用一个标签ID集合与之关联,而且对每一个已有的标签,一组对象ID与之关联。

比如如果我们的新闻ID 1000被加了三个标签tag 1,2,5和77,就能够设置以下两个集合:

$ redis-cli sadd news:1000:tags 1
(integer) 1
$ redis-cli sadd news:1000:tags 2
(integer) 1
$ redis-cli sadd news:1000:tags 5
(integer) 1
$ redis-cli sadd news:1000:tags 77
(integer) 1
$ redis-cli sadd tag:1:objects 1000
(integer) 1
$ redis-cli sadd tag:2:objects 1000
(integer) 1
$ redis-cli sadd tag:5:objects 1000
(integer) 1
$ redis-cli sadd tag:77:objects 1000
(integer) 1

要获取一个对象的全部标签,如此简单:

$ redis-cli smembers news:1000:tags
1. 5
2. 1
3. 77
4. 2

而有些看上去并不简单的操作仍然能使用对应的Redis命令轻松实现。比如我们或许想获得一份同一时候拥有标签1, 2, 10和27的对象列表。这能够用SINTER命令来做,他能够在不同集合之间取出交集。

因此为达目的我们仅仅需:

$ redis-cli sinter tag:1:objects tag:2:objects tag:10:objects tag:27:objects
... no result in our dataset composed of just one object ...

命令參考文档中能够找到和集合相关的其它命令,令人感兴趣的一抓一大把。

一定要留意SORT命令,Redis集合和list都是可排序的。

题外话:怎样为字符串获取唯一标识

在标签的样例里,我们用到了标签ID,却没有提到ID从何而来。基本上你得为每一个加入系统的标签分配一个唯一标识。

你也希望在多个client同一时候试着加入相同的标签时不要出现竞争的情况。此外,假设标签已存在。你希望返回他的ID,否则创建一个新的唯一标识并将其与此标签关联。

Redis 1.4将添加Hash类型。有了它,字符串和唯一ID关联的事儿将不值一提,但现在我们怎样用现有Redis命令可靠的解决它呢?

我们首先的尝试(以失败告终)可能例如以下。如果我们想为标签“redis”获取一个唯一ID:

  • 为了让算法是二进制安全的(仅仅是标签而不考虑utf8,空格等等)我们对标签做SHA1签名。SHA1(redis)=b840fc02d524045429941cc15f59e41cb7be6c52。
  • 检查这个标签是否已与一个唯一ID关联,

    用命令GET tag:b840fc02d524045429941cc15f59e41cb7be6c52:id
  • 假设上面的GET操作返回一个ID,则将其返回给用户。

    标签已经存在了。

  • 否则… 用INCR next.tag.id命令生成一个新的唯一ID(假定它返回123456)。
  • 最后关联标签和新的ID,

    SET tag:b840fc02d524045429941cc15f59e41cb7be6c52:id 123456

    并将新ID返回给调用者。

多美妙,也许更好…等等!当两个client同一时候使用这组指令尝试为标签“redis”获取唯一ID时会发生什么呢?假设时间凑巧,他们俩都会从GET操作获得nil,都将对next.tag.id key做自增操作,这个key会被自增两次。当中一个client会将错误的ID返回给调用者。幸运的是修复这个算法并不难,这是明智的版本号:

  • 为了让算法是二进制安全的(仅仅是标签而不考虑utf8。空格等等)我们对标签做SHA1签名。

    SHA1(redis)=b840fc02d524045429941cc15f59e41cb7be6c52。

  • 检查这个标签是否已与一个唯一ID关联。

    用命令GET tag:b840fc02d524045429941cc15f59e41cb7be6c52:id
  • 假设上面的GET操作返回一个ID。则将其返回给用户。标签已经存在了。
  • 否则… 用INCR next.tag.id命令生成一个新的唯一ID(假定它返回123456)。

  • 以下关联标签和新的ID。(注意用到一个新的命令)

    SETNX tag:b840fc02d524045429941cc15f59e41cb7be6c52:id 123456。假设还有一个client比当前client更快,SETNX将不会设置key。

    并且。当key被成功设置时SETNX返回1,否则返回0。

    那么…让我们再做最后一步运算。

  • 假设SETNX返回1(key设置成功)则将123456返回给调用者,这就是我们的标签ID,否则运行GET tag:b840fc02d524045429941cc15f59e41cb7be6c52:id 并将其结果返回给调用者。

有序集合

集合是使用频率非常高的数据类型,可是…对很多问题来说他们也有点儿太不讲顺序了;)因此Redis1.2引入了有序集合。

他和集合非常相似,也是二进制安全的字符串集合,可是这次带有关联的score,以及一个类似LRANGE的操作能够返回有序元素,此操作仅仅能作用于有序集合,它就是,ZRANGE 命令。

基本上有序集合从某种程度上说是SQL世界的索引在Redis中的等价物。

比如在上面提到的reddit.com样例中。并没有提到怎样依据用户投票和时间因素将新闻组合生成首页。我们将看到有序集合怎样解决问题,但最好先从更简单的事情開始,阐明这个高级数据类型是怎样工作的。让我们加入几个黑客。并将他们的生日作为“score”。

$ redis-cli zadd hackers 1940 "Alan Kay"
(integer) 1
$ redis-cli zadd hackers 1953 "Richard Stallman"
(integer) 1
$ redis-cli zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
$ redis-cli zadd hackers 1916 "Claude Shannon"
(integer) 1
$ redis-cli zadd hackers 1969 "Linus Torvalds"
(integer) 1
$ redis-cli zadd hackers 1912 "Alan Turing"
(integer) 1

对有序集合来说,按生日排序返回这些黑客易如反掌,由于他们已经是有序的。

有序集合是通过一个dual-ported 数据结构实现的。它包括一个精简的有序列表和一个hash table,因此加入一个元素的时间复杂度是O(log(N))。这还行。但当我们须要訪问有序的元素时,Redis不必再做不论什么事情,它已经是有序的了:

$ redis-cli zrange hackers 0 -1
1. Alan Turing
2. Claude Shannon
3. Alan Kay
4. Richard Stallman
5. Yukihiro Matsumoto
6. Linus Torvalds

你知道Linus比Yukihiro年轻吗

不管怎样。我想反向对这些元素排序。这次就用 ZREVRANGE 取代 ZRANGE 吧:

$ redis-cli zrevrange hackers 0 -1
1. Linus Torvalds
2. Yukihiro Matsumoto
3. Richard Stallman
4. Alan Kay
5. Claude Shannon
6. Alan Turing

一个很重要的小贴士,ZSets仅仅是有一个“默认的”顺序。但你仍然能够用 SORT 命令对有序集合做不同的排序(但这次server要耗费CPU了)。要想得到多种排序,一种可选方案是同一时候将每一个元素增加多个有序集合。

区间操作

有序集合之能不止于此,他能在区间上操作。比如获取全部1950年之前出生的人。我们用 ZRANGEBYSCORE 命令来做:

$ redis-cli zrangebyscore hackers -inf 1950
1. Alan Turing
2. Claude Shannon
3. Alan Kay

我们请求Redis返回score介于负无穷到1950年之间的元素(两个极值也包括了)。

也能够删除区间内的元素。比如从有序集合中删除生日介于1940到1960年之间的黑客。

$ redis-cli zremrangebyscore hackers 1940 1960
(integer) 2

ZREMRANGEBYSCORE 这个名字尽管不算好。但他却很实用,还会返回已删除的元素数量。

回到Reddit的样例

最后,回到 Reddit的样例。

如今我们有个基于有序集合的像样方案来生成首页。用一个有序集合来包括近期几天的新闻(用 ZREMRANGEBYSCORE 不时的删除旧新闻)。用一个后台任务从有序集合中获取全部元素,依据用户投票和新闻时间计算score。然后用新闻IDs和scores关联生成 reddit.home.page 有序集合。要显示首页,我们仅仅需闪电般的调用 ZRANGE。

不时的从 reddit.home.page 有序集合中删除过旧的新闻也是为了让我们的系统总是工作在有限的新闻集合之上。

更新有序集合的scores

结束这篇指南之前还有最后一个小贴士。

有序集合scores能够在不论什么时候更新。

仅仅要用 ZADD 对有序集合内的元素操作就会更新它的score(和位置),时间复杂度是O(log(N)),因此即使大量更新,有序集合也是合适的。

以下是自己练习redis的笔记:

String数据类型

set name zhengwei //设置键值对

get name //输出键为name的值

set name wuzhengwei //会覆盖之前的zhengwei

setnx 假设不存在则创建这个键,且返回1。假设存在则返回0。且不改动。

nx--not exist(不存在)

setnx name zhengwei //return 0

setex 指定键值对的有效期

setex name1  10 zhengwei //name1=zhengwei 有效期是10s,超过之后会删除该键值对

setrange 设置子字符串

setrange name 5 @ //把zhengwei的第五个字符開始。替换为@  替换之后为zheng@ei  仅仅替换部分

mset 一次性设置多个键值对,返回ok说明都设置成功,返回0为都没有设置

mset name1 zhengwei1 name2 zhengwei2 //两个键值对

msetnx 一次性设置多个键值对。返回ok说明都设置成功,返回0为都没有设置。不会覆盖已存在的键

msetnx name2 zhengwei name3 zhengwei3 //应该会返回0,由于name2已存在,所以批量设置不成功

getset 设置key的值,并返回key的旧值

getset name1 zhengwei //会返回zhengwei1。

而且会设置新值为zhengwei

getrange 获取子字符串

getrange name 0 5 //返回0-5个字符,[0,5]闭区间。

mget name1 name2 批量返回键相应的值

incr 递增  返回为递增后的值,不存在该键。则会默觉得0

incr age

incrby 同incr类似,加指定值。key不存在时会设置key,并觉得原来的value是0

incrby age 5  //对age一次递增5   递减设置为负数就能够

decr decrby 递减 传正数是递减。传负数时递增,同上面类似

append 在指定的键值后加入字符串,返回添加后的长度

append name wu //设置为zhengweiwu

strlen 对值查看长度

strlen name //返回zhengweiwu 的长度

hashes类型及操作

是一个string 类型的field和value的映射表.加入和删除是 o(1).

hset user:001 name zhengwei //设置userID为001 的用户的name,能够把user:001能够看做一张表

hget user:001 name

hsetnx 不存在先创建返回1。存在则不做不论什么操作返回0,nx--not exit(不存在)

hmset 批量设置,同一时候设置多个键

hmset user:002 name zhengwei age 20 sex 1 //return ok,说明设置成功

hmget user:002 name age sex //批量返回多个键值对

hincrby user:002 age 5  //对age 加5,跟incr相似

hexists user:002 age //查看该键值是否存在 return 1 or 0代表存在还是不存在

hlen 返回指定hash中的field的数量,即键的数量

hlen user:002 //return 3 name age sex

hdel 删除指定hash 的field

hdel user:002 age //return 1 ok 删除该键值对

hkeys user:002 //返回全部field name sex

hvals user:002 //返回全部values zhengwei 1  相应键的相应值

hgetall user:002 //上述两种结果的合集

lists类型

链表结构,push pop 获取一个范围内的全部值

key ---- 链表的名字。实质上就是就是一个每一个子元素都是string 类型的双向链表.能够作为栈和队列。

lpush 是从头插入-栈。rpush 是从尾压入-队列

lpush 从头部加入一个元素

lpush mylist "hello"

lpush mylist "world"

lrange mylist 0 -1 //从 0(头) 取到 -1(尾) 返回 “world” "hello" 后近先出

rpush mylist "hello"

rpush mylist "world"

linsert mylist before world ! //l是从头向尾方向

lset 更改指定下标的元素值

lset mylist 0 you 

lrem 从key 相应list 中删除n个和value同样的元素 n < 0 表示从尾删除,n ==  0表示所有删除 返回的是删除的值的个数

lrem mylist 1  you //应该会返回0 由于list中不再包括you

ltrim 保留指定key的值范围内的数据(闭空间),其余的数据删除

ltrim mylist 1 -1 //仅仅会保留[1,-1]的数据。return ok

lpop //从头部删除元素,并返回被删除的元素  l表示从头開始,r表示从尾開始弹出

rpop //同上的解释

rpoplpush 从第一个list的尾部弹出元素,而且从头压入到第二个list中,返回该元素

lindex 返回index位置的元素

llen 返回链表元素的个数

sets类型

是一个集合,string 类型的无需集合,通过hash table实现,操作的复杂度是常数,能够求交集,并集。

sadd 向集合中加入元素。

sadd myset hello  //return 1

sadd myset world //return 1

sadd myset hello //return 0

smembers 返回该集合中的全部元素

srem 删除元素 set remove 删除成功返回1 若元素不存在则删除失败。返回0

spop 随机删除并返回一个元素,没有不论什么规律

sdiff 两个集合的差集 

sdiff set1 set2 //返回set1 中没有出如今set2中的元素,即以set1为标准

sdiffstore set3 set1 set2 //把set1 和set2的差集存储到set3中,是上一条命令的补充

sinter 返回全部给定集合的交集

sinterstore 存储集合返回的差集

sunion 返回全部给定集合的并集

sunionstore 存储集合的并集

smove 从第一个集合中移除指定元素,并加入到第二个集合中

smove set1 set2 hello //将set1中的hello元素移动到set2中 return 1

scard 返回集合的元素个数

sismember 測试某一个元素是否是该集合的元素 return 0 return 1

sismember set1 hello //推断hello是否是set1中的元素

srandmember 随机返回一个元素。但不删除元素

sorted sets类型

在sets基础上加入顺序,在加入删除改动元素时能够指定。

每次制定后会自己主动排序

zadd 加入元素,须要指定两个值。一个为member 一个score

zadd myzset 1 one //顺序值是1,假设元素已存在,则会更新score

zrange myzset 0 -1 withscores //取出全部元素。而且显示顺序号

zrange myzset 0 -1            //仅仅是取出全部元素

zrem 删除指定元素,return 1 ok

zrem myzset hello //删除有序集合myzset中的hello元素

zincrby 对score指定添加.存在则添加。不存在则创建并添加。

zincrby myset 5 hello //对hello原有的score添加5,hello不存在则创建

zrank 返回member在有序集合中的排名-索引(与score无关),依照score从小到大排列

zrevrank 返回member在有序集合中的索引,依照score从大到小排列

zrevrange myset 0 -1 withscores //逆序显示

zrangebyscores myset 2 3 withscores //依据score显示子集合

zcount 返回集合中score在给定区间中的数量

zcount myset 2 4 

zcard 返回集合中全部元素的个数

zremrangebyrank 删除集合中排名在给定区间的元素

zremrangebyrank myset 1 1 //删除下表为1的元素(与score无关)

zremrangebyscore 同上



Redis经常使用命令:

键值相关命令和server相关命令

Keys 返回满足给定pattern的全部key

keys *     keys my* 

exists 确认一个key是否存在 return 0 表示不存在 return 1 表示存在

del 删除一个键

del name //删除键name 再exists 应该返回0

expire 设置一个键的过期时间

expire name 10 //设置name键的过期时间是10 s

ttl name //返回的是当前键的剩余有效时长 -1表示已过期

select 0 //选择数据库

move 将键移动到其它的数据库中

redis中的数据库是从0到15,没有数据库名

select 0 ---set age 30 ----get age -----move age 1 ---get age ---select 1 ---get age

persist 移除过期时间 return 1 表示成功取消

randomkey 随机返回一个key

rename 重命名

rename name name_new

type 返回键的数据类型

type name_new

server相关命令

ping 測试连接是否存活

echo 

select 选择数据库

quit exit 

dbsize 返回键的总数目

info 获取server相关统计

config get 实时转储收到的请求

config get * 返回相关參数的信息

flushdb 删除当前选择数据库中的全部key---清空当前数据库

flushall 清空全部数据库





Redis的高级应用

1)安全性

requirepass password //在配置文件里设置

auth password //client中完毕授权

redis-cli -a password //进入client时输入密码 两种授权方式

2)主从复制---从server和主server有同样数据库

1.master 能够拥有多个slave

2.slave也能够连接到其它slave

3.master 在同步数据时也会处理其它cli的请求

4.提高系统的伸缩性 

Sort 命令:

sort key 就可以对数据结构完毕排序

在对有序集合类型排序时会忽略元素的分数。仅仅对元素自身的值进行排序

zadd myzset 50 2 40 3 20 1 60 5  //值是 2 3 1 5 键是 50 40 20 60

sort myzset //return 1 2 3 5 

能够通过alpha參数实现对非数字的字典排序

sort key lapha

假设没有加入lapha sort会尝试将全部元素转换成双精度浮点数来计算

sort key desc 能够逆序排序

limit offset count 表示跳过前offset个元素并获取之后的count个元素

sort key desc limit 1 2  //分页时须要

by 參数

提供了by參数之后,将不会依照元素自身的值进行排序,而是对每一个元素的值替换參考件中的第一个* 并获取其值,然后依据该值对元素排序

lpush sortbylist 2 1 3

set itemscore:1 50

set itemscore:2 100

set itemscore:3 -10

sort sortbylist by itemscore:* desc  //return 2 1 3

能够这样理解:2 ->itemscore:2 -> 100

 1 ->itemscore:1 -> 50

 3 ->itemscore:3 -> -10

依照 100 50 -10 的顺序来排序,假设顺序发生变化,那么第一列中的2 1 3 也要变化。

存在一一映射关系。

当參考键中不含星号时,将不会运行排序操作,之后打印数据。

假设几个元素的參考值同样。则会比較元素本身的值来决定元素的顺序。

当某个元素的键不存在的时候。会默觉得0.

store參数:

默认情况下。store会直接返回排序结果。假设希望保存排序结果,能够使用store參数。

sort key by post:*->title get # store sort.result

性能优化:

1)尽可能降低待排序键中元素的数量。

2)使用limit參数仅仅获取须要的数据,不要返回大量不须要的数据。

3)假设要排序的数据量较大。尽量使用store參数来缓存结果。

Redis 数据结构解析和命令指南的更多相关文章

  1. 深入剖析Redis系列:Redis数据结构与全局命令概述

    前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. ...

  2. 3年Java开发都知道的Redis数据结构和通用命令

    Redis的数据结构 Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景. 五种基础数据结构 String:字符串,是构建其他数据结构的基础 ...

  3. redis数据结构和常用命令

    redis常用数据结构 String 最简单的K_V,value可以是数字或者字符串,使用场景:微博数.普通计数,命令:get set incr(加1) decr(减1) mget(获取多个值),se ...

  4. redis数据结构与主要命令

    redis的数据类型有:string.hashes.lists.sets,sorted sets 1.string类型: set.get添加键值对获得键值对.如果多次赋值会覆盖掉原来的value se ...

  5. Redis数据结构及常用命令(草稿)

    通用命令 数据类型 string 字符 list 列表 set 集合 zset 有序集合 hash 散列(字典中的字典) bitmap 位图 hyperloglog

  6. redis学习(二) redis数据结构介绍以及常用命令

    redis数据结构介绍 我们已经知道redis是一个基于key-value数据存储的数据结构数据库,这里的key指的是string类型,而对应的value则可以是多样的数据结构.其中包括下面五种类型: ...

  7. Redis 使用指南:深度解析 info 命令

    Redis 是一个使用  ANSI C 编写的开源.基于内存.可选持久性的键值对存储数据库,被广泛应用于大型电商网站.视频网站和游戏应用等场景,能够有效减少数据库磁盘 IO, 提高数据查询效率,减轻管 ...

  8. Redis五种基础与三种高级数据结构解析

    记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面 ...

  9. Redis 常用数据结构及其控制命令整合

    Redis 键值支持5种基本结构,分别是字符串,列表,哈希,集合,有序集合.每一种数据结构都有对应的取值和设值命令,辅助命令,除此之外,还有一些全局命令,用来管理Redis存储的所有 键. 全局命令 ...

随机推荐

  1. while循环输出的表格

    方法一: <?php echo '<table border="1" width="800" align="center"> ...

  2. 配置LAMP环境

    对我这种Linux小菜鸡来说,集成环境是最好的选择. 一,下载wget --no-check-certificate https://github.com/teddysun/lamp-yum/arch ...

  3. foy: 轻量级的基于 nodejs 的通用 build 工具

    npm 的 scripts 下写的命令太多就很容易很乱,各种第三方轮子都只能解决一部分问题,总感觉不是很好用,想找个类似 make 的工具只能找到 jake, 可是 jake 的 API 太老,居然很 ...

  4. 软件工程师应该关注的web加密手段

    加密算法 1.非对称加密(公开密钥加密)       公开密钥加密,是加密和解密使用不同密钥的算法,广泛用于信息传输中. 常见的算法有:RSA.ElGamal.Rabin. 2.对称加密       ...

  5. day01_10.for循环

    for和while都是一种循环 解释:所有循环的共同点 画图详解 在一条数轴上,循环就是有起始点($i=0); 有结束点($i<=10);有步长($i++); 每走一个相应的步长,就执行一次代码 ...

  6. Leetcode 480.滑动窗口中位数

    滑动窗口中位数 中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) ...

  7. [办公软件篇][3]windows软件安装

    http://www.jeffjade.com/2015/10/19/2015-10-18-Efficacious-win-software/

  8. c/c++内存泄露的检测方法

    此文内容摘自 https://zhuanlan.zhihu.com/p/22664202 作为   从零开始的 JSON 库教程(三):解析字符串解答篇  的笔记 1A. Windows 下的内存泄漏 ...

  9. golang语法要点笔记

    golang学习笔记 读<go学习笔记第四版> <学习go语言> <gopl-zh><Go语言实战>记录 多变量赋值时,先计算所有相关值,然后再从左到右 ...

  10. APM-应用性能管理

    APM(应用性能管理) 在信息科学和系统控制领域,APM致力于监控和管理应用软件性能和可用性.通过监测和诊断复杂应用程序的性能问题,来保证软件应用程序的良好运行(预期的服务),APM已经商用 基本定义 ...