一、redis

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

  Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便,Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。

redis作为非关系型数据库,其数据时存储在内存中。(MongoDB同为非关系型数据库,但是MongoDB的数据时存储在磁盘上的)

redis 安装:pip install redis

二、redis数据库的客户端连接

1、安装Redis Desktop Manager

 2、打开,并建立连接,redis默认端口6379,host为redis所在的ip地址

 

三、python操作redis

1、连接方式

  redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类

r=redis.Redis(host='xxxxx',port=6379,password='xxxx',db=10,decode_responses=True)

  • db=10 :指连接db10数据库
  • decode_responses=True :默认将返回结果decode,即将bytes类型改为默认utf-8。
import  redis
ip = '127.0.0.1'
password = '123456'

r1=redis.Redis(host=ip,password=password,port=6379,db=0,decode_responses=True)#redis默认连接db0
r2=redis.Redis(host=ip,password=password,port=6378,db=0,decode_responses=True)#decode_responses=True 自动解码,输出的结果自动由bytes类型变为字符串类型
print(r1.get('name'))

2、连接池

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

连接池:当程序创建数据源实例时,系统会一次性创建多个数据库连接,并把这些数据库连接保存在连接池中,当程序需要进行数据库访问时,无需重新新建数据库连接,而是从连接池中取出一个空闲的数据库连接

import  redis
ip = '127.0.0.1'
password = '123456'

conn_pool = redis.ConnectionPool(host=ip,password=password, port=6379)
r = redis.Redis(connection_pool=conn_pool)
r.set('name','zhangsansan')
print(r.get('name'))

3、string操作

set() 新增或修改redis中的数据,r.set(key,value)

set(name, value, ex=None, px=None, nx=False, xx=False)。在Redis中设置值,默认,不存在则创建,存在则修改

参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行
xx,如果设置为True,则只有name存在时,当前set操作才执行

r1.set('zyh001','89898')#redis中设置值,默认不存在则创建,存在则修改
print(r1.get('zyh001'))
r1.set('zyh_info','{"name":"xxxx","password":"123456","account":11234}') #类似字典的形式插入数据

get()查看操作的数据,r.get(key),通过key去查看数据,输出的结果是value值

res  = r1.get('zyh_info') #如果在连接时,没加decode_responses=True,则默认输出结果是bytes类型,前面带b
print('bytes类型输出是',res)
print('字符串类型输出是',res.decode()) #由bytes类型转成字符串类型;如果在连接时加上decode_responses=True,则可自动转成字符串,此步骤就不需要了,且加入此步骤还会报错
# s.encode()  字符串变成bytes类型

#输出结果如下
bytes类型输出是 b'{"name":"xxxx","password":"123456","account":11234}'  #最前面会显示一个‘b’
字符串类型输出是 {"name":"xxxx","password":"123456","account":11234}

r.delete(key)、r.flushall()、r.flushdb() 删除数据

r1.delete('zyh001')#删除这条数据,print的时候存在返回1,不存在返回0.key不存在的话,也不会报错
r.flushall() #清空所有数据库里面的数据
r.flushdb() #只清空当前数据库里面的数据,连接时指定的数据库:db=10

r.keys()获取表中所有的key

print(r1.keys())

查找key的模糊匹配操作

print(r1.keys('*info*'))#模糊匹配所有带info的key,*代表全部

r.expire()指定key的过期时间,到期后此条数据被自动删除

r.set('qml_session','sdfsdfsdfss')
r.expire('qml_session',30) #指定过期时间为30秒,单位默认是秒

r.type(key) 获取key的数据类型

print(r.type('sms_code'))
print(r.type('yulin:xxx'))

#输出结果:
hash
string

4、hash类型的操作

r.hset(key_A, key_a, value_a) 新增或修改

res1=r1.hset('zyh','123456','09876544')#新增值
r1.hset('zyh','123456','1234567') #修改值,有的时候修改,没有新增
print(r1.hget('zyh','123456'))

查询单条key操作 r.hget(key_A, key_a)

print(r1.hget('zyh','123456'))

查询某个大key_A下的所有内容  r.hgetall(key_A)

print(r1.hgetall('zyh'))
#输出
{'123456': '1234567', '12345678': '1234567'}

删除指定的key_a   r.hdel(key_A, key_a)

r1.hdel('zyh','12345678')#删除指定的小key_a,即使key_a不存在,程序也不会报错
print(r1.hgetall('zyh'))

r.delete(key-A)删掉整个key的值

r1.delete('zyh')

获取数据类型 r.type(key_A)

print(r.type('sms_code'))
print(r.type('yulin:xxx'))

#输出结果:
hash
string
    • hash哈希类型:可理解为一个字典嵌套。如{“sesssion_hwm":{"huangwenmin":"123456","wuxufang":"123456"}}
    • 增加/修改数据:  
      • r.hset('Fkey','Skey','value') 

        • Fkey  #外层key/大key,惟一的
        • Skey  #Fkey下的内层key/小key,惟一的。同一个Fkey可以有多个Skey。
    • 删除数据:  
      • r.hdelete('Fkey','Skey')  #删除指定小key。删除不存在的key,不会报错
    • 查询数据:
      • r.hget('Fkey','Skey')  # 返回小key对应的值。小key不存在,返回None
      • r.hgetall('session_hwm')  #获取到hash类型里大key对应的所有的数据。如{b'hxf': b'aaaa', b'wumin': b'hahaha'}。如果大key不存在,返回{}
      • r.hkeys('Fkey')  #返回大key对应的所有小key。当Fkey不存在时,返回空列表[]
      • r.hexits('Fkey','Skey')  #判断小key是否存在。如果存在,返回True; 如果不存在,返回False
  • 4、公用方法:
    • 删除数据:
      • r.flushdb()  #清空当前所有的key
      • r.delete('Fkey')  #删除指定大key。不存在的key,不会报错
    • 查询数据:
      • r.ttl('key')  # 返回kdy对应的失效时间。如果key设置时没有指定失效时间,则用ttl方法时会返回None
      • r.type('key')  #返回类型b'string'
      • r.exists('Fkey')  # 判断最外层key是否存在。如果存在,返回True; 如果不存在,返回False
      • res.decode()  #如果值为中文,返回结果如:\xe5\xa5\xb3,使用decode()将其转化为中文。

        • res可以如下:res=r.get('hwm_info')     res=r.hget('session_hwm','huangwenmin')
    • 增加/修改数据:
      • r.expire('Fkey',ExpireTime)   #指定Fkey的失效时间。以秒为单位

5、更多操作及参考

http://www.cnblogs.com/melonjiang/p/5342505.html

http://www.cnblogs.com/melonjiang/p/5342383.html

https://www.jianshu.com/p/2639549bedc8