Redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

redis模块安装:sudo pip install redis

  1. #!/usr/bin/env python
  2. #coding:utf8
  3.  
  4. import redis
  5.  
  6. pool=redis.ConnectionPool(host='127.0.0.1',port=6379)
  7. r=redis.Redis(connection_pool=pool)
  8. r.set('name','xym')#设置key,value
  9. print r.keys()#获取所有key
  10. print r.get('name')#通过key获取value
  11.  
  12. r.set('sex',18,nx=True)#nx=True sex不存在才执行,否则设置了也不生效
  13. r.set('sex',19,nx=True)#sex的值还是18
  14. print r.get('sex')
  15. r.set('id',1,ex=5)#ex=5 5秒钟过期
  16. r.set('id',5,xx=True)#id必须已经存在,设置才生效
  17.  
  18. r.setnx('files','1.txt')#files不存在,才生效
  19. r.setex('name','xym',3)#3秒过期
  20.  
  21. r.psetex('name',4000,'xym')#name,过期时间4000毫秒,value
  22.  
  23. r.mset(k1='k1',k2='k2')#批量设置
  24. print r.mget(['k1','k2'])#批量获取
  25. print r.keys()
  26.  
  27. r.set('k1','aaa')
  28. print r.getset('name','k1')#设置新值name=k1,获取旧的k1的值
  29. print r.get('name')
  30.  
  31. r.set('name','xuyanmei')
  32. print r.getrange('name',0,4)#获取04范围的key
  33.  
  34. r.set('name','xuyanmei')
  35. r.setrange('name',0,'love')#从索引0开始把love替换 结果:lovenmei
  36.  
  37. print r.strlen('name')# lovenmei 长度为8 .获取name值的长度
  38.  
  39. r.incr('nums',amount=1)#如果nums不存在,设置nums=1,多次设置值为自增
  40. #nums=1
  41. #nums=2
  42. #nums=3
  43.  
  44. r.incrbyfloat('nums',amount=2.0)#如果nums不存在,nums的值每次自增2
  45.  
  46. r.decr('aa',amount=1)#如果nums存在,nums=19,每次自减1.否则nums=-1每次自减等于-2
  47.  
  48. r.append('name','kis')#name对应的值后面追加内容
  49. #lovenmeikis
  50.  
  51. r.hset('n1','age','')#设置hash表中的键值
  52. r.hmset('n2',{'a':1,'b2':2})#批量设置hash表中的键值
  53.  
  54. ############### get #################
  55. print r.hget('n1','age')#获取hash表中n1的键值
  56.  
  57. print r.hmget('n1',['age'])#在name对应的hash中获取多个key的值
  58. print r.hgetall('n2')#获取name对应hash的所有键值
  59. print r.hlen('n2')#获取name对应的hash中键值对的个数
  60. print r.hkeys('n2')#获取name对应的hash中所有的key的值
  61. print r.hvals('n2')#获取name对应的hash中所有的value的值
  62. print r.hexists('n2','a')#检查name对应的hash是否存在当前传入的key
  63. r.hdel('n2','a')#将name对应的hash中指定key的键值对删除
  64.  
  65. r.hincrby('n2','a')#自增name对应的hash中的指定key的值,不存在则创建key=amount
  66. r.hincrbyfloat('n2','c')#自增name对应的hash中的指定key的值,不存在则创建key=amount
  67.  
  68. ####################list####################
  69. r.lpush('name_list','a','b','c')#创建列表,从右往左的顺序操作
  70. print r.lrange('name_list',0,-1)#查询列表指定范围
  71. r.lpushx('name_list','e')## name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边,一次只能插入一个值
  72. print r.llen('name_list')# name对应的list元素的个数
  73.  
  74. r.linsert('name_list','BEFORE','b',123)#在列表name_list,元素b的前面插入123
  75. ['e', 'c', '', 'b', 'a']
  76. r.linsert('name_list','AFTER','c','love')#在列表name_list,元素c的前面插入love
  77. ['e', 'c', 'love', '', 'b', 'a']
  78.  
  79. r.lset('name_list',2,'xuyanmei')#对name对应的list中的某一个索引位置重新赋值
  80. ['e', 'c', 'xuyanmei', '', 'b', 'a']
  81. print r.lrange('name_list',0,-1)
  82.  
  83. r.lrem('name_list','c',2)
  84. # value,要删除的值
  85. # num, num=0,删除列表中所有的指定值;
  86. # num=2,从前到后,删除2个;
  87. # num=-2,从后向前,删除2个
  88. data=r.blpop('name_list')#在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
  89. # print r.lrange('name_list',0,-1)
  90. #name 列表名字
  91. # start,索引的起始位置
  92. # end,索引结束位置
  93. r.ltrim('name_list',3,6)#在name对应的列表中移除没有在start-end索引之间的值

集合

  1. r.delete("s")
  2. r.delete('s2')
  3. print(r.sadd("s", "a", 'b')) # 添加数据到集合's'
  4. print(r.smembers('s')) # 查看集合成员
  5. print(r.scard('s')) # 判定集合长度,不存在则为0
  6. print(r.sismember('s', 'a')) # 判定对象是否存在集合里
  7. print(r.sadd('s2', 'a'))
  8. print(r.sinter('s', 's2')) # 获取两个集合的交集,{b'a'}
  9. print(r.sinterstore('s3', 's', 's2')) # 求交集,并把结果付给s3,返回交集个数
  10. print(r.smembers('s3'))
  11.  
  12. print(r.smembers('s')) # {b'b', b'a'}
  13. print(r.smembers('s2')) # {b'a'}
  14. print(r.sunion('s', 's2')) # {b'b', b'a'}求并集,返回两个集合的所有元素,不重复
  15.  
  16. print(r.sunionstore('s4', 's', 's2')) # 将两个集合的并集赋值给s4
  17. print(r.smembers('s4'))
  18.  
  19. print(r.sdiff('s', 's2')) # 求集合s里有,但是集合s2里没有的元素
  20. print(r.sdiffstore('s5', 's', 's2')) # 将两个集合的差集赋值给S5
  21. print(r.smembers('s5'))
  22.  
  23. print(r.srandmember('s')) # 取随机元素
  24.  
  25. print(r.smove(src='s', dst='s6', value='b')) # 将集合成员b移到另一个集合,成功为True,否则False
  26. print(r.smembers('s6'))
  27. print(r.smembers('s'))
  28.  
  29. print(r.sadd('s', 11, 33, 44))
  30. print(r.smembers('s'))
  31. print(r.spop('s')) # 移除尾部一个成员,并将其返回
  32. print(r.srem('s', 11)) # 删除集合成员11
  33. print(r.smembers('s'))
  1. #print(r.sadd('s', 11, 22, 33, 11, 10))
  2. #print(r.sscan(name='s', count=1, match="1*")) # 匹配集合1*的成员
  3. #print(r.sscan_iter('s', match='1*')) # 返回一个迭代器,用于增量分批获取元素,避免内存消耗太大
  1.  

有序集合

  1. print(r.delete('zs'))
  2. print(r.zadd('zs', 'h1', 1, 'h2', 2))
  3. print(r.zadd('zs', n1=11, n2=22))
  4.  
  5. print(r.zcard('zs')) # 获取集合长度,也就是成员个数
  6. print(r.zcount('zs', 1, 23)) # 获取集合分数在1到23之间,包含1和23的个数
  7.  
  8. print(r.zincrby('zs', 11, amount=1)) # 自增集合对应成员的有序集合的对应分数
  9. print(r.zincrby('zs', 11, amount=1))
  10. print(r.zrange(name='zs', start=0, end=-1)) # 获取集合范围内的有序集合成员
  11. # 参数:
  12. # name,redis的name
  13. # start,有序集合索引起始位置(非分数)
  14. # end,有序集合索引结束位置(非分数)
  15. # desc,排序规则,默认按照分数从小到大排序
  16. # withscores,是否获取元素的分数,默认只获取元素的值
  17. # score_cast_func,对分数进行数据转换的函数
  18.  
  19. print(r.zrevrange(name='zs', start=0, end=-1)) # 按照分数从大到小排序集合
  20.  
  21. print(r.zrangebyscore(name='zs', min=1, max=11)) # 获取集合分数内的成员
  22. print(r.zrevrangebyscore(name='zs', max=13, min=1)) # 按照分数从大到小排序集合成员
  23.  
  24. print(r.zrank(name='zs', value='h2')) # 获取某个成员在集合中的排行
  25. print(r.zrevrank(name='zs', value='n1')) # 从大到小排序,获取某个成员排行位置
  26.  
  27. print(r.zrem('zs', 'n1')) # 删除集合对应的成员
  28. print(r.zrange('zs', 0, -1))
  29.  
  30. print(r.zremrangebyrank(name='zs', min=1, max=2)) # 删除指定排序范围成员,即删除下标1,不包含1,到下标2,包含2
  31. print(r.zrange('zs', 0, -1))
  1. print(r.zremrangebyscore(name='zs', min=1, max=20)) # 删除指定分数范围内的集合成员
  2. print(r.zrange(name='zs', start=0, end=-1))
  3.  
  4. print(r.zscore(name='zs', value='n2')) # 返回集合成员对应的分数,浮点数
  5.  
  6. r.delete('s2')
  7. print(r.zadd('s2', n3=222, n2=222))
  8. print(r.zinterstore(dest='news', keys=['zs', 's2'])) # 求两个有序集合的并集
  9. print(r.zrange(name='news', start=0, end=-1))
  10.  
  11. print(r.zunionstore(dest='nn', keys=['zs', 's2'])) # 求两个集合的并集,如果遇到不同值分数,则按照aggregate进行操作
  12. # aggregate值为:SUM,MIN,MAX
  13. print(r.zrange(name='nn', start=0, end=-1))
  14.  
  15. print(r.zscan(name='zs', count=1)) # 同字符串类似,新增score_cast_func用来进行对分数进行操作
  16.  
  17. print(r.delete('test')) # 删除任意数据类型
  18. print(r.exists(name="test")) # 判断name是否存在
  19.  
  20. print(r.keys(pattern="*")) # 打印所有匹配对KEY
  21. # KEYS * 匹配数据库中所有 key 。
  22. # KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
  23. # KEYS h*llo 匹配 hllo 和 heeeeello 等。
  24. # KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
  25. print(r.expire(name='zs', time=2)) # 为某个name设置超时时间
  26.  
  27. print(r.rename(src='zs', dst='ns')) # 重命名某个name
  28.  
  29. print(r.move(name='zs', db=2)) # 将某个name移到到指定DB下,前提name存在,否则返回False
  30.  
  31. print(r.randomkey()) # 随机获取一个name,不删除
  32.  
  33. print(r.type("zs")) # 获取name对应对类型

管道

redis-py默认值执行每次请求都会创建连接池申请连接,和断开连接池一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下,一次pipline是原子性操作

  1. import redis
  2. pool = redis.ConnectionPool(host="127.0.0.1", port=6379)
  3. r = redis.Redis(connection_pool=pool)
  4. pipe = r.pipeline(transaction=True)
  5. r.set('name', 'xym')
  6. r.set('role', 'master')
  7. pipe.execute()

发布订阅

  1.  

创建redis_common.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4.  
  5. """
  6. import redis
  7.  
  8. class RedisHelper(object):
  9. def __init__(self):
  10. self.__conn = redis.Redis(host="127.0.0.1")
  11. self.chan_pub = 'fm104.5'
  12. self.chan_sub = 'fm104.5'
  13.  
  14. def public(self, msg):
  15. self.__conn.publish(self.chan_pub, message=msg)
  16. return True
  17.  
  18. def subscribe(self):
  19. pub = self.__conn.pubsub()
  20. pub.subscribe(self.chan_sub)
  21. pub.parse_response()
  22. return pub

创建发布者redis_pub.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. """
  5. from redis_common import RedisHelper
  6.  
  7. obj = RedisHelper()
  8. obj.public('hello') # 发布一条消息到频道fm104.5

创建订阅者redis_sub.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4.  
  5. """
  6. from redis_common import RedisHelper
  7.  
  8. obj = RedisHelper()
  9. redis_sub = obj.subscribe()
  10.  
  11. while True:
  12. msg = redis_sub.parse_response() # 此时一直阻塞状态,直到能接收到数据,
  13. print(msg)

day10-redis操作的更多相关文章

  1. Atitit.redis操作总结

    Atitit.redis操作总结 1.1. 获取redis所有kv1 1.2. dbsize:返回当前数据库中key的数目 1 1.3. 一起吧所有key列出来1 1.4. Java连接redis   ...

  2. 基于 php-redis 的redis操作

    基于 php-redis 的redis操作 林涛 发表于:2016-5-13 12:12 分类:PHP 标签:php,php-redis,redis 203次 redis的操作很多的,下面的例子都是基 ...

  3. redis操作

    测试环境redis操作 cd /export/servers/redis-2.8.9/src/./redis-cli -n 0 keys keys(pattern):返回满足给定pattern的所有k ...

  4. php的redis 操作类,适用于单台或多台、多组redis服务器操作

    redis 操作类,包括单台或多台.多组redis服务器操作,适用于业务复杂.高性能要求的 php web 应用. redis.php: <?php /* redis 操作类,适用于单台或多台. ...

  5. Redis操作Set工具类封装,Java Redis Set命令封装

    Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...

  6. Redis操作List工具类封装,Java Redis List命令封装

    Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...

  7. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  8. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

  9. 设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

    1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式. 在它的核心结构中仅仅包括一个被称为单例类的特殊类. 通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问.从而方便对实例个 ...

  10. Redis操作string

    Redis简介: ''' redis: 缓存,例如两个个程序A,B之间要进行数据共享,A可以把数据存在redis(内存里),其他程序都可以访问redis里的数据, 这样通过中间商redis就实现了两个 ...

随机推荐

  1. Android App Build System

  2. IOS照片颠倒分析及PHP服务端的处理

    前言: 因朋友的PHP小项目, 而去帮忙解决了一个小问题, 现在来总结概括一下. 也不知道大家在使用和开发的过程中有没有遇到类似的场景, IPhone手机上传照片后, 发现图片方向颠倒了, 甚至各种姿 ...

  3. 错误集:js解析jQuery.post返回的xml之Could not find action or result

    js里用jQuery.post去后台查询数据,返回的是xml格式的数据流. js代码: var params = ""; params = encodeURI(params); v ...

  4. led驱动

    驱动步骤: 1.驱动框架:一般读驱动代码需要module_init一层层找代码 2.硬件配置 代码中led_ioctl函数设置引脚的电平高低,该函数是驱动程序对设备的通道进行统一设置/控制的函数 一. ...

  5. ie 8 下post提交提交了两次

    擦你吗呀,IE8! 老子写一个登录功能,IE他妈的给我登录了两次,导致权限校验错误,什么他妈的鬼问题,调了两天....fuck,都是泪水. 解决方案:提交按钮加返回值<input type=&q ...

  6. 洛谷 P3384 树链剖分(模板题)

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  7. 如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:

    32位的Windows:---------------------------------------------------------------------------1. 运行->cmd ...

  8. 深度学习框架 Torch 7 问题笔记

    深度学习框架 Torch 7 问题笔记 1. 尝试第一个 CNN 的 torch版本, 代码如下: -- We now have 5 steps left to do in training our ...

  9. golang,liteide设置 windows7(64)

    1.安转go的环境,exe安装包 2.下载liteide27.2.1 3.打开liteide开始开发,在里面添加gopath,无法读取windows里面的gopath设置,不知道什么原因,以管理员运行 ...

  10. linux开机启动mongodb

    方式一(不推荐) ubuntu编辑/etc/rc.local /home/wyt/bin/mongodb-linux-x86_64-ubuntu1404-3.2.8/bin/mongod --dbpa ...