博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【python】-- Redis简介、命令、示例
阅读量:7111 次
发布时间:2019-06-28

本文共 7932 字,大约阅读时间需要 26 分钟。

Redis简介

Redis 是完全开源免费的,遵守,是一个高性能的key-value数据库。

 Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势:

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的(意思就是要么成功执行要么失败完全不执行),单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis与其他key-value存储的区别:

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

 

一、Linux下redis安装:

1、下载、解压、编译

$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz$ tar xzf redis-4.0.6.tar.gz$ cd redis-4.0.6$ make

make完后 redis-4.0.6目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:

2、启动服务端

$ src/redis-server

3、启动客户端

$ src/redis-cli

4、测试验证

127.0.0.1:6379> set name testOK127.0.0.1:6379> get name"test"

 最新版本安装

 

 

二、Rides的操作命令

1、对value的操作命令:

exists(key):确认一个key是否存在del(key):删除一个keytype(key):返回值的类型keys(pattern):返回满足给定pattern的所有keyrandomkey:随机返回key空间的一个keyrename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的keydbsize:返回当前数据库中key的数目expire:设定一个key的活动时间(s)ttl:获得一个key的活动时间select(index):按索引查询move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库flushdb:删除当前选择数据库中的所有keyflushall:删除所有数据库中的所有key

2、对String操作的命令

set(key, value):给数据库中名称为key的string赋予值valueget(key):返回数据库中名称为key的string的valuegetset(key, value):给名称为key的string赋予上一次的valuemget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的valuesetnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为valuesetex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间timemset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value imsetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value iincr(key):名称为key的string增1操作incrby(key, integer):名称为key的string增加integerdecr(key):名称为key的string减1操作decrby(key, integer):名称为key的string减少integerappend(key, value):名称为key的string的值附加valuesubstr(key, start, end):返回名称为key的string的value的子串

3、对List操作的命令

rpush(key, value):在名称为key的list尾添加一个值为value的元素lpush(key, value):在名称为key的list头添加一个值为value的 元素llen(key):返回名称为key的list的长度lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素lindex(key, index):返回名称为key的list中index位置的元素lset(key, index, value):给名称为key的list中index位置的元素赋值为valuelrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0从 头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。 lpop(key):返回并删除名称为key的list中的首元素 rpop(key):返回并删除名称为key的list中的尾元素 blpop(key1, key2,… key N, timeout):lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对 keyi+1开始的list执行pop操作。brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

4、对Set(无序集合)操作的命令

sadd(key, member):向名称为key的set中添加元素membersrem(key, member) :删除名称为key的set中的元素memberspop(key) :随机返回并删除名称为key的set中一个元素smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合scard(key) :返回名称为key的set的基数sismember(key, member) :测试member是否是名称为key的set的元素sinter(key1, key2,…key N) :求交集sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合sunion(key1, key2,…key N) :求并集sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合sdiff(key1, key2,…key N) :求差集sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合smembers(key) :返回名称为key的set的所有元素srandmember(key) :随机返回名称为key的set的一个元素

5、zset(sorted set有序集合)操作的命令

zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。zrem(key, member) :删除名称为key的zset中的元素memberzincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为incrementzrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素 zcard(key):返回名称为key的zset的基数 zscore(key, element):返回名称为key的zset中元素element的score zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素 zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行 AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素 的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。

6、对Hash操作的命令

hset(key, field, value):向名称为key的hash中添加元素field<—>valuehget(key, field):返回名称为key的hash中field对应的valuehmget(key, field1, …,field N):返回名称为key的hash中field i对应的valuehmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value ihincrby(key, field, integer):将名称为key的hash中field的value增加integerhexists(key, field):名称为key的hash中是否存在键为field的域hdel(key, field):删除名称为key的hash中键为field的域hlen(key):返回名称为key的hash中元素个数hkeys(key):返回名称为key的hash中所有键hvals(key):返回名称为key的hash中所有键对应的valuehgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

7、持久化

save:将数据同步保存到磁盘bgsave:将数据异步保存到磁盘lastsave:返回上次成功将数据保存到磁盘的Unix时戳shundown:将数据同步保存到磁盘,然后关闭服务

8、远程服务控制

info:提供服务器的信息和统计monitor:实时转储收到的请求slaveof:改变复制策略设置config:在运行时配置Redis服务器

详细Redis命令演示说明:

 

 

三、Python操作Redis示例

1、redis-py

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

import redis r = redis.Redis(host="192.168.1.64", port=6379)r.set("foo", "Bar")print(r.get("foo"))

2、redis-py连接池

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

import redispool = redis.ConnectionPool(host="192.168.1.64", port=6379)r = redis.Redis(connection_pool=pool)r.set("foo", "bar")print(r.get("foo"))

3、redis-py管道

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

import redis pool = redis.ConnectionPool(host="192.168.1.64", port=6379) r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False)pipe = r.pipeline(transaction=True) pipe.set("name","test")pipe.set("role", "ceo") pipe.execute()

4、发布订阅

 

4.1、对发布订阅进行封装

import redis class RedisHelper(object):     def __init__(self):        self.__conn = redis.Redis(host="localhost")        self.chan_sub = 'fm104.5'        self.chan_pub = 'fm104.5'     def public(self,msg):        "发布"        self.__conn.publish(self.chan_pub,msg)  #发布消息        return  True     def subscribe(self):        "订阅"        pub = self.__conn.pubsub() #打开收音机        pub.subscribe(self.chan_sub) #调频道        pub.parse_response() #准备接收        return pub

4.2 、发布者

from monitor.redis_helper import RedisHelper obj = RedisHelper()redis_sub = obj.subscribe() while True:    msg = redis_sub.parse_response() #第2次准备接收动作    print(msg)

4.3 、订阅者 

from monitor.redis_helper import RedisHelper  obj = RedisHelper()obj.public("hello world")  #发布消息

4.4、redis命令演示订阅发布

发布:

127.0.0.1:6379> help publish   PUBLISH channel message  summary: Post a message to a channel  since: 2.0.0  group: pubsub 127.0.0.1:6379> publish "fm104.5" helloword   #publish 频道   消息(integer) 1

订阅:

127.0.0.1:6379> help subscribe   SUBSCRIBE channel [channel ...]  summary: Listen for messages published to the given channels  since: 2.0.0  group: pubsub 127.0.0.1:6379> subscribe "fm104.5"   #subscribe  频道,可以订阅多个频道Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "fm104.5"3) (integer) 1

redis.py

转载于:https://www.cnblogs.com/Keep-Ambition/p/8056862.html

你可能感兴趣的文章
Anroid搭建一个局域网Web服务器
查看>>
kettle删除资源库中的转换或者作业
查看>>
java的重写规则
查看>>
Java Spring MVC项目搭建(一)——Spring MVC框架集成
查看>>
Base64编码原理与应用
查看>>
物联网产业链八大环节全景图
查看>>
spark dataframe操作集锦(提取前几行,合并,入库等)
查看>>
阿里巴巴
查看>>
__FUNCTION__, __LINE__ 有助于debug的宏定义
查看>>
性能学习笔记(1)
查看>>
伺服电机的调试步骤有哪些
查看>>
php取两个整数的最大公约数算法大全
查看>>
P1525 关押罪犯
查看>>
input子系统驱动学习之中的一个
查看>>
Android--绑定服务调用服务的方法
查看>>
shell中的四种模式匹配
查看>>
(转)Making 1 million requests with python-aiohttp
查看>>
The Google File System论文拜读
查看>>
Web应用扫描工具Wapiti
查看>>
hadoop-17-hive数据库元数据查看
查看>>