Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为string(字符串),list(列表),set(集合),hash(散列),zset(有序集合),下面将分别对这5种数据类型的控制命令进行总结,熟话说好记性不如烂笔头,方便以后查看。

1. 字符串命令

  Redis种的字符串有三种类型的值:字节,整数和浮点数

(1)命令列表

  SET:SET key value ------设置存储在给定键种的值

  GET:GET key value ------获取存储在给定键种的值

  DEL:DEL key ------删除存储在给定键种的值(这个命令可以用于所有类型)

  INCR:INCR key ------将键对应的值加1

  DECR:DECR key ------将键对应的值减1

  INCRBY:incrby key number ------将键对应的值加number

  DECRBY:decrby key number ------将键对应的值减number

  APPEND:append key value ------将值value追加到给定键key当前村粗的值的末尾

  GETRANGE:getrange key start end ------获取从start到end范围内的字串

  SETRANGE:setrange key offset val ------将从offset偏移量开始的字串设置指定值val

  GETBIT:getbit key offset ------返回位串中偏移量为offset的二进制位值

  SETBIT:setbit key offset val ------位串中偏移量为offset的二进制位值设置为val

  BITCOUNT:biitcount key [start end] ------统计二进制位串里面值位1的二进制位数量

  BITOP:bitop operation dest-key key1 [key2...] ------对一个或多个二进制位串执行包括并、或、异或、非在内的任意一种位运算操作

(2)示例

  1. redis 127.0.0.1:6379> set name zhangsan
  2. OK
  3. redis 127.0.0.1:6379> set age 18
  4. OK
  5. redis 127.0.0.1:6379> get name
  6. "zhangsan"
  7. redis 127.0.0.1:6379> get age
  8. "18"
  9. redis 127.0.0.1:6379> incr age
  10. (integer) 19
  11. redis 127.0.0.1:6379> decr age
  12. (integer) 18
  13. redis 127.0.0.1:6379> incrby age 5
  14. (integer) 23
  15. redis 127.0.0.1:6379> decrby age 5
  16. (integer) 18
  17. redis 127.0.0.1:6379> append name _lisi
  18. (integer) 13
  19. redis 127.0.0.1:6379> get name
  20. "zhangsan_lisi"
  21. redis 127.0.0.1:6379> getrange name 1 0
  22. ""
  23. redis 127.0.0.1:6379> getrange name 0 -1
  24. "zhangsan_lisi"
  25. redis 127.0.0.1:6379> setrange name 0 wangmazi
  26. (integer) 13
  27. redis 127.0.0.1:6379> get name
  28. "wangmazi_lisi"
  29. redis 127.0.0.1:6379> del name
  30. (integer) 1
  31. redis 127.0.0.1:6379> get name
  32. (nil)

(3)注意事项

  a. 如果对一个不存在的键或者一个保存了空串的键执行自增或自减操作,那么Redis在执行操作时会将这个键的值当作0来处理

  b. 即使在设置键时输入的值位字符串,但只要这个值可以可以被理解为整数,就可以当作整数来处理

  c. GETRANGE命令由以前的SUBSET命令改名而来的,如果是2.6或以上redis版本,使用getrange()方法来获取字串

2. 列表命令

(1)一些常用的列表命令

  RPUSH:rpush key value [value1...] ------将一个或多个值添加到列表的右端

  LPUSH:lpush key value [value1...] ------将一个或多个值添加到列表的左端

  RPOP:rpop key ------移除并返回列表最右端的元素

  LPOP:lpop key ------移除并返回列表最左端的元素

  LINDEX:lindex key offset --------返回列表中偏移量为offset的元素

  LRANGE:lrange key start end ------返回列表中偏移量在[satrt,end]范围内的元素,包括satrt和end

  LTRIM:ltrim key start end ------对列表进行修剪,只保留从start到end范围内的元素,包括start和end

  1. redis 127.0.0.1:6379> rpush key 1,2,3
  2. (integer) 1
  3. redis 127.0.0.1:6379> lpush key 4,5,6
  4. (integer) 2
  5. redis 127.0.0.1:6379> lrange key 0 -1
  6. 1) "4,5,6"
  7. 2) "1,2,3"
  8. redis 127.0.0.1:6379> rpush key hello
  9. (integer) 3
  10. redis 127.0.0.1:6379> lrange key 0 -1
  11. 1) "4,5,6"
  12. 2) "1,2,3"
  13. 3) "hello"
  14. redis 127.0.0.1:6379> lindex key 2
  15. "hello"
  16. redis 127.0.0.1:6379> ltrim key 1 2
  17. OK
  18. redis 127.0.0.1:6379> lrange key 0 -1
  19. 1) "1,2,3"
  20. 2) "hello"

(2)阻塞式的列表弹出命令以及在列表之间元素的移动

  BLPOP blpop key1 [key2...] timeout ------从一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素

  BRPOP

  BPOPLPUSH bpoplpush source-key dest-key ------从原始列表弹出最右端的元素并压入目标列表左端,并返回这个元素

  BRPOPLPUSH BRPOPLPUSH source-key dest-key timeout ------从原始列表弹出最右端的元素并压入目标列表左端,并返回这个元素,如果source-key为空阻塞等待

3. 集合命令

  Redis的集合以无序的方式来存储多个各不相同的元素,可以快速的对集合进行添加,删除、元素检查、组合和关联等操作

(1)常用集合命令

  SADD:sadd key item [item...] ------将一个或多个元素添加到集合中

  SREM:srem key item [item...] ------从集合中移除一个或多个元素

  SISMEMBER:sismember key item ------检查item是否存在于集合key里面

  SCARD:scard key ------返回集合包含的元素的数量

  SMEMBERS:smembers key ------返回集合包含的所有元素

  SRANDMEMBER:srandmember key [count] ------从集合里随机的返回一个或多个元素

  SPOP:spop key ------随机地移除几个中的一个元素,并返回被移除的元素

  SMOVE:smove source-key dest-key item ------如果原集合包含item,从原集合移除item并将item添加到集合目标集合,成功返回1,否则返回0

(2)示例

  1. redis 127.0.0.1:6379> sadd key 1 2 3
  2. (integer) 3
  3. redis 127.0.0.1:6379> smembers key
  4. 1) "1"
  5. 2) "2"
  6. 3) "3"
  7. redis 127.0.0.1:6379> sadd key 3
  8. (integer) 0
  9. redis 127.0.0.1:6379> scard key
  10. (integer) 3
  11. redis 127.0.0.1:6379> srem key 3
  12. (integer) 1
  13. redis 127.0.0.1:6379> smembers key
  14. 1) "1"
  15. 2) "2"
  16. redis 127.0.0.1:6379> srandmember key
  17. "2"
  18. redis 127.0.0.1:6379> smembers key
  19. 1) "1"
  20. 2) "2"
  21. redis 127.0.0.1:6379> spop key
  22. "1"
  23. redis 127.0.0.1:6379> smembers key
  24. 1) "2"

(2)组合和关联命令

  SDIFF:sdiff key1 [key2...] ------返回那些存在于第一集合key1,但不存在于其他集合中的元素

  SDIFFSTORE:sdiffstore dest-key key1 [key2...] -------将SDIFF的结果存到目标集合中

  SINTER:sinter key1 [key2...] ------返回那些同时存在于所有集合中的元素

  SINTERSTORE:sinterstore dest-key key1 [key2] ------将SINTER的结果放到目标集合中

  SUNION:sunion key1 [key2...] ------返回那些至少存在于一个集合中的元素

  SUNIONSTORE:sunionstore dest-key key1 [key2...] ------将SUNION的结果放到表集合中

(3)示例

  1. redis 127.0.0.1:6379> sadd key1 a b c d e
  2. (integer) 5
  3. redis 127.0.0.1:6379> sadd key2 c d e f
  4. (integer) 4
  5. redis 127.0.0.1:6379> smembers key1
  6. 1) "c"
  7. 2) "d"
  8. 3) "e"
  9. 4) "a"
  10. 5) "b"
  11. redis 127.0.0.1:6379> smembers key2
  12. 1) "c"
  13. 2) "d"
  14. 3) "e"
  15. 4) "f"
  16. redis 127.0.0.1:6379> sdiff key1 key2
  17. 1) "a"
  18. 2) "b"
  19. redis 127.0.0.1:6379> sinter key1 key2
  20. 1) "c"
  21. 2) "d"
  22. 3) "e"
  23. redis 127.0.0.1:6379> sunion key1 key 2
  24. 1) "c"
  25. 2) "d"
  26. 3) "a"
  27. 4) "e"
  28. 5) "b"

4. 散列命令

  Redis的散列将多个键值对存储在Redis的键里面

(1)散列常用命令

  HSET:hset key-name key value ------为散列添加键值对

  HGET:hget key-name key ------得到散列的键值对

  HMSET:hmset key-name key value [key name...] -------为散列设置一个或多个键值对

  HMGET:hmget key-name key [key...] ------得到散列的一个或多个键值对

  HDEL:hdel key-name key [key...] ------删除散列里面的一个或多个键值对

  HLEN:hlen key-name ------返回散列包含的键值对数量

  HEXISTS:hexists key-name key ------检查键值是否在散列中

  HKEYS:hkeys key-name ------得到散列的所有键值

  HVALS:hvals key-name ------得到散列的所有键对应的值

  HGETALL:hgetall key-name ------得到散列的说有键值对

  HINCRBY:hincrby key-name key number ------将键key的值加上整数number

  HINCRBYFLOAT:hincrbyfloat key-name key number ------将键key的值加上浮点数number

(2)示例

  1. redis 127.0.0.1:6379> hmset person name zhangsan age 17
  2. OK
  3. redis 127.0.0.1:6379> hmget person name age
  4. 1) "zhangsan"
  5. 2) "17"
  6. redis 127.0.0.1:6379> hset person sex man
  7. (integer) 1
  8. redis 127.0.0.1:6379> hlen person
  9. (integer) 3
  10. redis 127.0.0.1:6379> hgetall person
  11. 1) "name"
  12. 2) "zhangsan"
  13. 3) "age"
  14. 4) "17"
  15. 5) "sex"
  16. 6) "man"
  17. redis 127.0.0.1:6379> hkeys person
  18. 1) "name"
  19. 2) "age"
  20. 3) "sex"
  21. redis 127.0.0.1:6379> hvals person
  22. 1) "zhangsan"
  23. 2) "17"
  24. 3) "man"
  25. redis 127.0.0.1:6379> hincrby person age 8
  26. (integer) 25
  27. redis 127.0.0.1:6379> hget person age
  28. "25"

5. 有序集合命令

  和散列存储着键与值之间的映射类似,有序集合也存储着成员与分值之间的映射,并且提供了分值处理命令,以及和根据分值大小有序地获取或扫描成员和分值的命令

(1)常有有序集合命令

  ZADD:zadd key-name score number [score number...] ------将带有分值的成员添加到有序集合

  ZREM:arem key-name number [number...] ------从有序集合里面移除指定的成员,并返回被移除成员的数量

  ZCARD:zcard key-name ------返回有序集合包含的成员数量

  ZINCRBY:zincrby key-name increment number ------将number成员的分值加上increment

  ZCOUNT:zcount key-name min max ------返回分值介于min和max之间的成员数量

  ZRANK:zrank key-name merber ------返回成员member在有序集合中的排名

  ZRANGE:zrange key-name start stop [withscores] ------返回排名介于start和stop之间的成员,如果给定了withscores则分值一起返回

  ZSCORE:zscore key-name number ------返回成员number的分值

(2)示例

  1. redis 127.0.0.1:6379> zadd ages 19 person1 20 person2 30 person3
  2. (integer) 3
  3. redis 127.0.0.1:6379> zcard ages
  4. (integer) 3
  5. redis 127.0.0.1:6379> zcount ages 0 40
  6. (integer) 3
  7. redis 127.0.0.1:6379> zrange ages 0 40 withscores
  8. 1) "person1"
  9. 2) "19"
  10. 3) "person2"
  11. 4) "20"
  12. 5) "person3"
  13. 6) "30"
  14. redis 127.0.0.1:6379> zscore ages person2
  15. "20"
  16. redis 127.0.0.1:6379> zincrby ages 10 person3
  17. "40"
  18. redis 127.0.0.1:6379> zscore ages person3
  19. "40"
  20. redis 127.0.0.1:6379> zincrby ages -10 person3
  21. "30"
  22. redis 127.0.0.1:6379> zscore ages person3
  23. "30"

(3)有序集合更高级命令

  ZREVRANK:zrevrank key-name number ------返回有序集合里成员number的排名,按照分值从大到小的排列

  ZREVRANGE:zrevrange key-name start stop [withscores] ---- 返回zrange的反序内容

  ZREVRANGEBYSCORE:zrevrangebyscore key-name min max [withscores]  [limit offset count]------返回有序集合中,分值介于min和max之间的所有成员,并按照分值大小的顺序返回

  ZREMRANGEBYRANK:zremrangebyrank key-name satrt stop ------移除有序集合中排名介于satrt和stop之间的所有成员

  ZREMRANGEBYSCORE:zremrangebyscore key-name min max ------移除有序集合中分值介于satrt和stop之间的所有成员

  ZINTERSTORE:zinterstore dest-key key-count key1 [key2...] [WEIGHTS weight [weight...]] [AGGREGATE SUM|MIN|MAX] ------对给定的有序集合执行类似集合的交集运算

  ZUNIONSTORE:zunionstore dest-key key-count key1 [key2...] [WEIGHTS weight [weight...]] [AGGREGATE SUM|MIN|MAX] ------对给定的有序集合执行类似集合的并集运算

(4)示例

  1. redis 127.0.0.1:6379> zrank ages person1
  2. (integer) 0
  3. redis 127.0.0.1:6379> zrevrank ages person1
  4. (integer) 2
  5. redis 127.0.0.1:6379> zrevrange ages 0 40 withscores
  6. 1) "person3"
  7. 2) "30"
  8. 3) "person2"
  9. 4) "20"
  10. 5) "person1"
  11. 6) "19"
  12. redis 127.0.0.1:6379> zcard ages
  13. (integer) 3
  14. redis 127.0.0.1:6379> zrevrangebyscore ages 40 0 withscores
  15. 1) "person3"
  16. 2) "30"
  17. 3) "person2"
  18. 4) "20"
  19. 5) "person1"
  20. 6) "19"

6. 发布与订阅命令

  发布(publish)与订阅(subscribe)的特点是订阅者负责订阅频道(channel),发送者负责向频道发送二进制字符串消息,每当由消息被发送到给定频道时,频道的所有订阅者都会收到消息。

  SUBSCRIBE:subscribe channel [channel] ------订阅给定的一个或多个频道

  UNSUBSCRIBE:unsubcribe channel [channel] ------退订给定的一个或多个频道

  PUBLISH:publish channel [channel...] ------向给定频道发送消息

  PSUBSCRIBE:psubscribe pattern [pattern] ------订阅与给定模式相匹配的所有频道

  PUNSUBSCRIBE:punsubscribe pattern [pattern] ------退订给定的模式,如果执行时没有给定任何模式,那退订所有模式

7. 小试牛刀

  简单示例:实现文章发布,获取和投票

(1)文章发布

  1. ONE_WEEK_IN_SECOND = 7*24*60*60
  2. def post_article(conn, user, title, link):
  3. '''文章发布,实现以下操作:
  4. (1) 获取文章id
  5. (2) 初始化集合管理已投票用户
  6. (3) 初始化文章信息散列表
  7. (4) 初始化分数有序集合
  8. (5) 初始化时间有序集合
  9. '''
  10. article_id = str(conn.incr('article:')) #得到文章id
  11.  
  12. voted_key = 'voted:' + article_id #已投票集合key
  13. conn.sadd(voted_key,user) #创建集合管理已投票用户,自己不允许投票
  14. conn.expire(voted_key,ONE_WEEK_IN_SECOND) #设置键的过期时间
  15.  
  16. now = time.time()
  17. article_key = 'article:' + article_id #文章信息散列key
  18. # 初始化文章信息散列表
  19. conn.hmset(article_key, {
  20. 'title':title,
  21. 'link:':link,
  22. 'poster':user,
  23. 'time':now,
  24. 'votes':1})
  25.  
  26. # 初始化分数有序集合
  27. conn.zadd('score:', {article_key:now+VOTE_SCORE})
  28. # 初始化时间有序集合
  29. conn.zadd('time:', {article_key:now})
  30. return article_id

(2)文章获取

  1. def get_articles(conn, page, order='score:'):
  2. '''默认根据分数排名获取指定页的文章信息'''
  3. #设定每页文章数目
  4. ARTICLES_PER_PAGE = 5
  5. start = (page-1)*ARTICLES_PER_PAGE
  6. end = start + (ARTICLES_PER_PAGE -1)
  7. ids = conn.zrange(order, start, end)
  8. articles = []
  9. for id in ids:
  10. article_data = conn.hgetall(id)
  11. article_data['id'] = id
  12. articles.append(article_data)
  13.  
  14. return articles

(3)投票

  1. def article_vote(conn, id, user):
  2. '''对文章进行投票,投票规则:
  3. (1)投票的有效期时间为1周
  4. (1)一篇文章一周内用户只允许投一次票
  5. (2)分数计算方式为每投一次票加432分
  6. '''
  7. VOTE_SCORE = 432
  8. # 根据文章ID获取文章的发布时间,判断是否在投票的有效期内
  9. article_key = 'article:' + id
  10. publish_time = conn.zcore('time:', article_key)
  11. if publish_time + ONE_WEEK_IN_SECOND < time.time():
  12. return
  13. else:
  14. #用户可以投票,用户完成投票后将该用户添加到已投票用户管理集合
  15. voted_key = 'voted:' + id
  16. if conn.sadd(voted_key, user):
  17. #更新score:有序集合列表分数
  18. conn.zincrby('socre:',article_key, VOTE_SCORE)
  19. #更新散列表文章信息
  20. conn.hincr(article_key, 'votes')

(4)对文章获取进行测试

  1. if __name__ == '__main__':
  2. try:
  3. conn = redis.Redis()
  4. except:
  5. raise 'connect exception'
  6. else:
  7. post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
  8. post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
  9. post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
  10. post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
  11. post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
  12. post_article(conn,'fate0729','Redis train','https://www.cnblogs.com/')
  13.  
  14. articles = get_articles(conn, 0)
  15. for article in articles:
  16. print('-----article--------')
  17. for key, val in article.items():
  18. if isinstance(key,bytes):
  19. print('{}:{}'.format(key.decode(encoding='utf-8'),val.decode('utf-8')))
  20. else:
  21. print('{}:{}'.format(key,val.decode('utf-8')))

  输出:

 摘自:https://www.cnblogs.com/xiaobingqianrui/p/10069476.html
 
 

Redis实战之Redis命令的更多相关文章

  1. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  2. Redis实战之Redis + Jedis[转]

    http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报   目录(?)[-] ...

  3. Redis 实战 —— 05. Redis 其他命令简介

    发布与订阅 P52 Redis 实现了发布与订阅(publish/subscribe)模式,又称 pub/sub 模式(与设计模式中的观察者模式类似).订阅者负责订阅频道,发送者负责向频道发送二进制字 ...

  4. Redis实战总结-Redis的高可用性

    在之前的博客<Redis实战总结-配置.持久化.复制>给出了一种Redis主从复制机制,简单地实现了Redis高可用.然后,如果Master服务器宕机,会导致整个Redis瘫痪,这种方式的 ...

  5. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  6. 分布式缓存技术redis系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  7. Redis 实战 —— 14. Redis 的 Lua 脚本编程

    简介 Redis 从 2.6 版本开始引入使用 Lua 编程语言进行的服务器端脚本编程功能,这个功能可以让用户直接在 Redis 内部执行各种操作,从而达到简化代码并提高性能的作用. P248 在不编 ...

  8. .Net Redis实战——使用Redis构建Web应用

    示例介绍 示例1:借助Redis实现购物车功能 示例2:Redis实现网页缓存和数据缓存 借助Redis实现购物车功能 每个用户的购物车都是一个散列,散列存储了商品ID与商品订购数量之间的映射.订购商 ...

  9. Redis 实战 —— 04. Redis 数据结构常用命令简介

    字符串 P39 Redis 的字符串是一个有字节组成的序列,可以存储以下 3 种类型的值:字节串(byte string).整数.浮点数. 在需要的时候, Redis 会将整数转换成浮点数.整数的取值 ...

随机推荐

  1. python3.7 安装

    python3.7 安装 下载安装 cd /usr/localwget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgztar -xvf ...

  2. linux下正则表达式学习

    下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 " ...

  3. DLL的Export和Import及extern "C"

    今天使用Unrar.dll,在调用RARProcessFileW时,VS总是提示“error LNK2001: 无法解析的外部符号”. Unrar.dll中是使用 extern "C&quo ...

  4. nyoj-0708-ones(dp)

    nyoj-0708-ones 题意:用1,+,*,(,). 这四个符号组成表达式表达数s(0 <= s <= 10000),且1最少时1的的个数 状态转移方程: dp[i] = min(d ...

  5. Win10系列:JavaScript 模板绑定

    WinJS库模板提供了一种格式化显示多条数据的便捷方式,通过这种方式可以将模板与ListView或FlipView等控件结合使用以控制数据的显示格式.定义一个WinJS库模板的方法与定义WinJS库控 ...

  6. SQL 常用判断语句

    我们在做sql更新时,为防止sql重复执行报错,需要对所需要执行的对象进行判断是否存在: 常用判断脚本如下: 判断视图是否存在 IF object_id('viewname') IS not NULL ...

  7. scratch如何获取透明的图片

    scratch中,每个对象都有一个造型,这个造型可以是载入外部的图片,但是外部图片很多是有背景的,放入scratch舞台区,有背景,很是不爽.用wps2016的ppt演示, 把文本框等另存为图片,图片 ...

  8. Vue + Element UI 实现权限管理系统 (功能组件封装)

    组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...

  9. 初时Windows程序

    window 操作系统中,处处是窗体 优点:简单 强大 方便 灵活 步骤: 新建项目 项目类型 visual C#项目 模板 window应用程序 用partial 将同一个窗体的代码分开放在两个文件 ...

  10. [Leetcode 135]糖果分配 Candy

    [题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...