一、Redis介绍:
Redis可以看作是一个key-value的存储系统,它为我们提供了丰富的数据结构,包括lists,sets,ordered sets和hashes。还包括了对这些数据结构的丰富操作。
优点:
性能高:支持超过100+每秒的读写频率。
支持丰富的数据理性。
原子性:Redis的所有操作都是原子性的。
丰富的特性:支持publish/subscribe,通知,过期等特性。
Windows下Reidis的安装:
Redis下载地址:
http://www.newasp.net/soft/67186.html#downloads
在使用redis之前,首先需要运行redis-server.exe,然后运行redis-cli.exe。
二、Redis使用:
丰富的数据类型:
2.1.String类型:
String类型还支持批量的读写操作。
还可以存储数字,并支持对数字的加减操作。
String类型还支持对其部分的修改和获取操作
2.2 List
Redis能够将数据存储成一个链表,并能对这个链表进行丰富的操作
Redis对List集合的修改操作:
在某个值之前添加一项:
截取List集合中的几个值:
2.3 集合Sets类型
Redis能够将一些列不重复的值存储成一个集合。
Sets结构也支持相应的修改操作:
删除一个元素:
添加一个元素:
Redis还支持对集合的子交并补等操作:
交集:
并集:
补集:
2.4 有序集合(Sorted Sets类型)
Sorted Sets和Sets结构相似,不同的是存在Sorted Sets中的数据会有一个score属性,并在写入时就按这个score排好序。
其中,第一个参数为顺序,第二个参数为值。
如果写入的值已经存在,则返回失败结果0。
查询某个值在集合中的位置:
查询在该范围内的值得总数:
查询:
2.5 Hash类型:能够存储key对多个属性的数据。
三、Publish /Subscribe
Redis支持这样一种特性,可以将数据推送到某个信息管道中,然后其他人可以通过订阅这些管道来获取推送过来的数据。
3.1订阅信息管道:
从一个客户端输入如下命令:
从另外一个客户端推送消息:
第一个客户端就可以获取到推送的消息
3.2按一定模式批量订阅
用命令订阅所有channel开头儿的信息通道:
推送信息:
第一个客户端收到的推送信息内容:
四、数据设置过期时间:
Redis支持按key设置过期时间,过期后值将被删除(在客户端看来是被删除了的)
用TTL命令可以获取某个key的过期时间(-1表示永不过期)
Exists:判断key值是否存在
Expire:设置过期时间
还可以通过Redis设置某个时间点的过期时间:
五、事务性:
Redis中以nx结尾命令都是在判断这个值存在不存在,如果不存在才会执行命令:
如下:setnx表示先观察name值是否存在,如果不存在,再重新赋值。
Redis还支持自定义命令组合,通过multi和exec,可以将命令组合起来一起执行。可以用dicard
命令来中断执行中的命令序列。
六、持久化
Redis中所有的数据都是存储在内存中的,并支持数据的持久化。
6.1 数据快照
通过save命令将数据存到一个扩展名为rdb的数据文件。
在dump.rdb文件中:
七、管理命令
Redis支持多个DB,默认为16个,不同DB间数据具有隔离性。可以再多个DB间实现数据的移动。使用select 命令,选择数据库,使用move命令实现不同DB之间数据的移动。
Redis中的一些命令还可以获取一些运行信息:
Dbsize:查看数据库的大小
通过对flushdb命令对某个数据库进行清除:
八、在Python中使用redis
在python中提供了操作redis的模块。
#coding:utf-8
import redis
r=redis.Redis(host='127.0.0.1',port=6379,db=1)
info=r.info()
for key in info:
print "%s:%s"%(key,info[key])
print "-------------"*3
print "dbsize%s"%r.dbsize()
print "ping%s"%r.ping()
print "-------------"*3
print r.get('name')
#----------------------------------String操作------------------------
#设置元素
print "-------------"*3
r.set('name','aa')
print r.get('name')
#为c1设置值
print "-------------"*3
r['c1']='bar'
print r.getset('c1','jj')
#得到所有包含name的key的值
print "-------------"*3
print 'keys:',r.keys('name*')
#随机取一个Key值
print "-------------"*3
print 'randomkey:',r.randomkey()
#查看数据是否存在 有则返回True ,没有则返回Flase
print r.exists('name')
#删除数据 删除成功返回1
print 'delete:',r.delete('name')
print r.delete('c1')
#更改key的值:
print r.set('name','gina')
r.rename('name','new_name')
print r.get('new_name')
#设置数据过期时间
r.expire('c1',5)
#查看过期时间 永不过期返回-1
r.set('name','haha')
print r.ttl('name')
r.save()
#取最后一次save时间
print r.lastsave()
r.set('intv','9')
print r.incr('intv')
print r.incrby('intv','5')
r['c1']='aa'
r['c2']='bb'
#批量获取数据
print r.mget('c1','c2')
#获取开头为c的key的值
print r.keys('*c*')
#---------------------对list集合进行操作---------------------
print r.lpush('students','gina')
print 'list len:',r.llen('students')
print r.lrange('students',start=0,end=3)
#取出一位
print 'list index 0:',r.lindex('gina',0)
#截取列表
print r.ltrim('students',start=0,end=3)
#--------------------对set集合进行操作-----------------------
r.sadd('s','a')
r.scard('s')
#判断对象是否存在
print r.sismember('s','a')
print r.sinterstore('s1','s2','s3')
#求并集
r.sunion('s1','s2')
#在s1中有,但在s2,s3中没有的数:
r.sdiff('s1','s2','s3')
#取一个随机数
print r.srandmember('s1')