一、Redis的介绍
redis是业界主流的key-value nosql 数据库之一。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
二、Redis的优点
- 异常快速 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
- 支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。
- 操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
- MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据。
三、redis安装
tar zxf redis-5.0.3.tar.gz #解压安装包
yum install gcc -y
cd redis-5.0.3/
make
make install
cd utils/
./install_server.sh #全部回车,默认选项
netstat -tnlp #可查看到6379端口
四、redis连接
1. 操作模式
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
import redis #导入redis模块
import time
redis.Redis(host='localhost',port=6379) #连接redis数据库
conn=redis.Redis() #定义操作游标
conn.set('name','westos',3) #在Redis中设置name及对应值westos,默认不存在则创建,存在则修改。存在时间为3s`在这里插入代码片`
print(conn.get('name')) #打印获取到数据库中name对应的值
print('等待3s...')
time.sleep(3) #等待3s
print(conn.get('name')) #打印获取到数据库中name对应的值,此时无值输出
2. 连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
import time
import redis
pool = redis.ConnectionPool(host='localhost',port=6379)#建立连接池
conn = redis.Redis(connection_pool=pool) #将连接池作为参数传给Redis
conn.set('name','黎明',4) #4代表的是失效时间 单位为s
#默认返回bytes类型 如果需要转换 要解码为utf-8编码格式
print(conn.get('name').decode('utf-8'))
代码:
结果:
三、STRING 字符串的操作
1. r.set 设置值
set(name, value, ex=None, px=None, nx=False, xx=False)
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
xx,如果设置为True,则只有name存在时,当前set操作才执行
2. mset 批量设置值
#批量设置值
r.mset(name1='zhangsan', name2='lisi')
#或
r.mget({"name1":'zhangsan', "name2":'lisi'})
3. mget(keys, *args) 批量获取
#批量获取
print(r.mget("name1","name2"))
#或
li=["name1","name2"]
print(r.mget(li))
4. getset 设置新值,打印原值
#设置新值,打印原值
getset(name, value)
print(r.getset("name1","wangwu")) #输出:zhangsan
print(r.get("name1")) #输出:wangwu
5. getrange 根据字节获取子序列
#根据字节获取子序列
getrange(key, start, end)
r.set("name","zhangsan")
print(r.getrange("name",0,3))#输出:zhan
6. setrange 修改字符串内容,从指定字符串索引开始向后替换,如果新值太长时,则向后添加
#修改字符串内容,从指定字符串索引开始向后替换,如果新值太长时,则向后添加
setrange(name, offset, value)
r.set("name","zhangsan")
r.setrange("name",1,"z")
print(r.get("name")) #输出:zzangsan
r.setrange("name",6,"zzzzzzz")
print(r.get("name")) #输出:zzangszzzzzzz
7. strlen(name) 返回name对应值的字节长度
#返回name对应值的字节长度(一个汉字3个字节)
r.set("name","zhangsan")
print(r.strlen("name")) #输出:8
8.type 查看类型
r.type(name)
9、获取所有的key值
r.keys()
10、当前redis数据库中数据条数
r.dbsize()
11、删除指定的key-value值
r.set('score',100,3)
r.delete('score')
12、 清除redis里面的所有key-value
r.flushall()
四 、Set 操作
Set集合就是不允许重复的列表
1. sadd(name,values) 给name对应的集合中添加元素
#给name对应的集合中添加元素
r.sadd("set_name","aa")
r.sadd("set_name","aa","bb")
2. smembers(name) 获取name对应的集合的所有成员
#获取name对应的集合的所有成员
print(r.smembers('set_name'))
3. scard(name) 获取name对应的集合中的元素个数
#获取name对应的集合中的元素个数
r.scard("set_name")
*4. sdiff(keys, args) 在第一个name对应的集合中且不在其他name对应的集合的元素集合
#在第一个name对应的集合中且不在其他name对应的集合的元素集合
r.sadd("set_name","aa","bb")
r.sadd("set_name1","bb","cc")
r.sadd("set_name2","bb","cc","dd")
print(r.sdiff("set_name","set_name1","set_name2"))#输出:{aa}
5. sinter(keys, *args) 获取多个name对应集合的并集
#获取多个name对应集合的并集
r.sadd("set_name","aa","bb")
r.sadd("set_name1","bb","cc")
r.sadd("set_name2","bb","cc","dd")
print(r.sinter("set_name","set_name1","set_name2"))#输出:{bb}
6.sismember 检查value是否是name对应的集合内的元素
#检查value是否是name对应的集合内的元素
sismember(name, value)
7. sunion(keys, *args) 获取多个name对应的集合的并集
#获取多个name对应的集合的并集
r.sunion("set_name","set_name1","set_name2")
8. sunionstore(dest,keys, *args) 获取多个name对应的集合的并集,并将结果保存到dest对应的集合中
#获取多个name对应的集合的并集,并将结果保存到dest对应的集合中
9. srandmember(name, numbers) 从name对应的集合中随机获取numbers个元素
#从name对应的集合中随机获取numbers个元素
print(r.srandmember("set_name2",2))
10. srem(name, values) 删除name对应的集合中的某些值
#删除name对应的集合中的某些值
print(r.srem("set_name2","bb","dd"))