Python使用Redis数据库

Redis是一个高性能的key-value数据库,并且有以下三个特点:

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

Ubuntu安装Redis:

$sudo apt-get update
$sudo apt-get install redis-server
$ redis-server

查看是否启动: $ redis-cli

使用Redis客户端:
$ redis-cli
如果在远程服务上启动Redis客户端:
$ redis-cli -h host -p port -a password
有时候会有中文乱码,只需要redis-cli后面加上–raw

Redis的数据类型

Redis支持五种数据类型:string,hash,list,set(集合),zset(有序集合)

string:

可以包含任何数据,比如图片或者序列化的对象,这个类型最大能储存512MB

redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"

使用setget命令,例子中的name为变量名
可以使用DEL命令删除键

set(name, value, ex=None, px=None, nx=False, xx=False)
ex为过期时间(秒),px为过期时间(毫秒)

r.setnx(name, value) :只有当name的值不存在的时候,才设值
r.mset(k1="v1", k2="v2") :批量设置值
r.mget('k1', 'k2'):批量获取值
r.getset(name, value):设置新值并且获取原来的值

Hash:

这是一个键值对集合,特别适合用于存储对象

redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"

使用HMSET设置键值对,使用HGET获取对应的值

r.hset("hash1", "k1", "v1"):单个增加
r.hmset("hash2", {"k2": "v2", "k3": "v3"}):批量增加
r.hget("hash2", "k2"):单个取出
r.hmget("hash2", ["k2", "k3"]):批量取出
r.hgetall("hash1"):取出所有的键值对
r.hlen("hash1"):得到键值对个数
r.hkeys("hash1"):得到所有key的值
r.hvals("hash1"):得到所有value的值
r.hdel("hash1", "k1"):删除键值对

List:

Redis列表是简单的字符串列表,按照插入的顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边):

redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>

例子中runoob为list的名字,可以存储40多亿数据
r.lpush("list1", 11, 22, 33):从左边新增加元素
r.rpush("list2", 44, 55, 66):从右边新增元素
r.linsert("list2", "before", "11", "00"):固定索引号的位置插入元素,这表明第一个出现的元素11的前面插入00,可以为before也可以为after
r.lset("list2", 0, -11):指定索引号进行修改,中间参数为索引号
r.lrem("list2", "11", 2):将列表中从左边前两次出现的11元素给删掉,如果最后一个参数为负数,那么从右边删除
r.lindex("list2", 0):根据索引号取值

Set:

这是String类型的无序集合,集合是通过哈希表实现的,所以增加,删除,查找的复杂度都是O(1):

redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq  #这里添加第二次,但是集合内元素具有唯一性,所以第二次的插入将被忽略
(integer) 0
redis 127.0.0.1:6379> smembers runoob

1) "redis"
2) "rabitmq"
3) "mongodb"

sadd key member
这里使用sadd命令将string类型元素添加到key对应的set集合中,成功返回1,元素已存在返回0,set不存在返回错误

zset:

与set不同的是每个元素都会关联一个double类型的分数,然后通过分数为集合中的成员进行从小到大的排序,成员元素不可重复,但是分数可以重复

redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

zadd key score member
使用zadd命令,将元素添加到集合中,并且更新对应的分数score。

Redis事务:

Redis事务可以一次性执行多个命令,批量操作在发送EXEC命令前放入队列缓存,收到EXEC这个命令后进入事务执行,任意命令执行失败其余的命令依然被执行,在事务执行的过程中其他客户端提交的命令不会插入到事务执行命令的序列中。
例子如下:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

MULTI命令表明开始一个事务,然后添加各种命令,最后由EXEC命令执行事务中的所有命令
还可以使用DISCARD命令放弃执行事务块中的所有命令



Python使用Redis数据库

Redis有两个类Redis以及StrictRedis用于实现Redis命令,StrictRedis用来实现官方的语法和命令,Redis是它的子类,用来向后兼容旧版本的Redis-py

连接Redis:

import redis   
r = redis.Redis(host='localhost', port=6379, decode_responses=True)  #这个decode表示写入的value为string类型
r.set('name', 'yifan')  
print(r['name'])
print(r.get('name')) 

Redis连接实例是线程安全的,所以可以当做一个全局变量直接使用,如果需要另一个Redis数据库,那么就需要重新创建一个Redis实例来获取一个新的连接。

connection pool:管理对一个Redis的所有连接

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)  
r = redis.Redis(connection_pool=pool)
r.set('a', 'b')  
print(r.get('a'))  

可以直接创建一个connection pool,然后创建redis实例连接这个connection pool,就可以做到多个redis实例共享一个connection pool。

你可能感兴趣的:(数据库,Redis)