设为首页 收藏本站
查看: 1385|回复: 0

[经验分享] Redis一(Redis-py与String操作)

[复制链接]

尚未签到

发表于 2017-12-21 15:42:19 | 显示全部楼层 |阅读模式
Redis

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


  • 以字典结构存储数据
  • 允许通过TCP协议读取字典的内容
  • 强大的缓存系统, 可以为每个键设置TTL, 以及按照一定规则自动淘汰不需要的键
  • 支持使用列表的形式构造任务队列
  • 数据存储在内存中也可以持久化到硬盘
一、Redis安装和基本使用

1、安装
  

wget http://download.redis.io/releases/redis-3.2.8.tar.gz  
tar xzf redis
-3.2.8.tar.gz  
cd redis
-3.2.8  

make && make install  

  redis安装在/usr/local/bin/目录
  

redis-benchmark: ==> 性能测试工具  
redis-check-aof: ==> AOF文件修复工具
  
redis-check-dump: => RDB文件检查工具
  
redis-cli:       ==> 命令行客户端
  
redis-sentinel:   => 帮助管理redis实例的工具
  
redis-server:    ==> redis服务器
  

  启动服务端
  

#三种启动方式  
redis-server 默认端口6379
  
redis-server --port 端口号
  
redis-server /path/to/redis.conf  启动时的配置文件将覆盖系统同名配置项
  


2、Redis的部署
  先为了方便管理,将Redis文件中的conf配置文件和常用命令移动到统一文件中
  修改redis.conf配置文件,我们使用redis安装目录中的redis.conf作为配置文件,将其拷贝到/usr/local/etc目录,以后运行redis服务,就指定该配置文件。
  后台启动redis服务
  a)首先编辑conf文件,将daemonize属性改为yes(表明需要在后台运行)
  cd etc/
  Vi redis.conf
  daemonize yes
  b)再次启动redis服务,并指定启动服务配置文件
  redis-server /usr/local/redis/etc/redis.conf
  Redis 操作常用命令
  

Redis-server /usr..../redis.conf 启动redis服务,并指定配置文件  
Redis
-cli 启动redis 客户端  
Pkill redis
-server 关闭redis服务  
Redis
-cli shutdown 关闭redis客户端  
Netstat
-tunpl|grep 6379 查看redis 默认端口号6379占用情况  


二、Python操作Redis

1、安装redis-py
  

pip install redis  

  API使用
  redis-py 的API的使用可以分类为:


  • 连接方式
  • 连接池
  • 操作

    • String 操作
    • Hash 操作
    • List 操作
    • Set 操作
    • Sort Set 操作

  • 管道
  • 发布订阅
2、使用 redis-py
  redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
  直接使用
  

import redis  

  
r
= redis.Redis(host='192.168.49.130', port=6379)  
r.set(
'foo', 'Bar')  

print r.get('foo')  

  创建连接池:
  redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
  

import redis  

  
pool
= redis.ConnectionPool(host='192.168.49.130', port=6379)  

  
r
= redis.Redis(connection_pool=pool)  

#r = redis.StrictRedis(connection_pool=pool) #StrictRedis也是支持的  
r.set('foo', 'Bar')
  
print r.get('foo')
  


三、操作

a、String操作
  redis中的String在在内存中按照一个name对应一个value来存储。如图:
DSC0000.png


设值
  1、set
  

set(name, value, ex=None, px=None, nx=False, xx=False)  

#设值  

  

在Redis中设置值,默认,不存在则创建,存在则修改  参数:
  
     ex,过期时间(秒)
  
px,过期时间(毫秒)
  
nx,如果设置为True,则只有name不存在时,当前set操作才执行
  
xx,如果设置为True,则只有name存在时,岗前set操作才执行
  

  2、setnx
  

setnx(name, value)  

#设值,只有name不存在时,执行设置操作(添加)  

  3、setex
  

setex(name, value, time)  

# 设值, 参数:time,过期时间(数字秒 或 timedelta对象)  

  4、psetex
  

psetex(name, time_ms, value)  

# 设值 参数:time_ms,过期时间(数字毫秒 或 timedelta对象)  

  5.mset
  

mset(*args, **kwargs)  

#批量设值  
#
如:  
mset(k1='v1', k2='v2')
  
# 或
  
mget({'k1': 'v1', 'k2': 'v2'})
  


取值
  1、get
  

get(name)  

#取值  

  2、mget
  

mget(keys, *args)  

#批量获取  
#
如:  
mget('name', 'age')
  
# 或
  
r.mget(['name', 'age'])
  

  3、getset
  

getset(name, value)  

#设置新值并获取原来的值  


bit方式取值设值
  1、getrange
  

getrange(key, start, end)  

# 获取子序列(根据字节获取,非字符)  
#
参数:  
# name,Redis 的 name
  
# start,起始位置(字节)
  
# end,结束位置(字节)
  
# 如: "神一样的人儿" ,0-3表示 "神"
  

  2、setrange
  

setrange(name, offset, value)  

# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)  
#
参数:  
# offset,字符串的索引,字节(一个汉字三个字节)
  
# value,要设置的值
  

  3、setbit
  

setbit(name, offset, value)  

# 对name对应值的二进制表示的位进行操作  

  
# 参数:
  
# name,redis的name
  
# offset,位的索引(将值变换成二进制后再进行索引)
  
# value,值只能是 1 或 0
  

  
# 注:如果在Redis中有一个对应: n1 = "foo",
  
那么字符串foo的二进制表示为:01100110 01101111 01101111
  
# 所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,
  
那么最终二进制则变成 01100111 01101111 01101111,即:"goo"
  

  
# 扩展,转换二进制表示:
  

  
# source = ""
  
source = "foo"
  

  
for i in source:
  
num = ord(i)
  
print bin(num).replace('b','')
  

  
# 特别的,如果source是汉字怎么办?
  
#答:对于utf-8,每一个汉字占 3 个字节,汉字姓名一般为三个则有 9个字节
  
# 对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制
  
11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000
  

  4、getbit
  

getbit(name, offset)  

# 获取name对应的值的二进制表示中的某位的值 (0或1)  

  5、bitcount
  

bitcount(key, start=None, end=None)  

# 获取name对应的值的二进制表示中 1 的个数  
#
参数:  
# key,Redis的name
  
# start,位起始位置
  
# end,位结束位置
  

  6、bitop
  

bitop(operation, dest, *keys)  

# 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值  

  
# 参数:
  
# operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
  
# dest, 新的Redis的name
  
# *keys,要查找的Redis的name
  

  
# 如:
  
bitop("AND", 'new_name', 'n1', 'n2', 'n3')
  
# 获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中
  


获取值的长度
  strlen
  

strlen(name)  

# 返回name对应值的字节长度(一个汉字3个字节)  


自增
  1、incr
  

incr(self, name, amount=1)  

# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。  

  
# 参数:
  
# name,Redis的name
  
# amount,自增数(必须是整数)
  

  
# 注:同incrby
  

  2、incrbyfloat
  

incrbyfloat(self, name, amount=1.0)  

# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。  

  
# 参数:
  
# name,Redis的name
  
# amount,自增数(浮点型)
  

  3、decr
  

decr(self, name, amount=1)  

# 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。  

  
# 参数:
  
# name,Redis的name
  
# amount,自减数(整数)
  


追加
  append
  

append(key, value)  

# 在redis name对应的值后面追加内容  

  
# 参数:
  
    key, redis的name
  
value, 要追加的字符串
  

  更多参见:https://github.com/andymccurdy/redis-py/
  http://doc.redisfans.com/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426522-1-1.html 上篇帖子: Redis的部署及使用 下篇帖子: 部署Redis+Cluster主从
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表