Python redis 利用引见

发布日期:2019-10-29 22:52:41 阅读数: 625次 来源:亚博手机app

亚博手机app-
					<p>本章节我们将为大师引见 Python 若何操作 redis,redis 是一个 Key-Value 数据库,Value 支撑 string(字符串),list(列表),set(调集),zset(有序调集),hash(哈希类型)等类型。</p>
<p>关于 redis 的更多内容能够参考我们的 redis 教程,留意在进修本章节之前你要确保你的 redis 办事曾经安装。</p>

<p>redis 启动界面如下:</p>
<div class=

启动 redis

$ ./redis-server
75858:C 25 Oct 11:43:34.329 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
75858:M 25 Oct 11:43:34.331 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                            
      _.-``    `.  `_.  ''-._           Redis 3.0.3 (255fcb1a/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'
` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'
   |     PID: 75858
  `-._    `-._  `-./  _.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'
_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'
_.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'
_.-'    |                                  
  `-._    `-._`-.__.-'
_.-'    _.-'                                  
      `-._    `-.__.-'    _.-'                                      
          `-._        _.-'                                          
              `-.__.-'
                                             

75858:M 25 Oct 11:43:34.337 # Server started, Redis version 3.0.3
75858:M 25 Oct 11:43:34.339 * DB loaded from disk: 0.002 seconds
75858:M 25 Oct 11:43:34.339 * The server is now ready to accept connections on port 6379

能够看到默认端标语为 6379


安装 redis 模块

Python 要利用 redis,需要先安装 redis 模块:

sudo pip3 install redis
或
sudo easy_install redis
或
sudo python setup.py install

源码地址:https://github.com/WoLpH/redis-py

测试能否安装成功:

>>> import redis
>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)
>>> r.set('foo', 'bar')
True
>>> r.get('foo')
'bar'

redis 供给两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部门官方的号令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。

redis 取出的成果默认是字节,我们能够设定 decode_responses=True 改成字符串。

实例

import redis   # 导入redis 模块

r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
r.set('name', 'runoob')  # 设置 name 对应的值
print(r['name'])
print(r.get('name'))  # 取出键 name 对应的值
print(type(r.get('name')))  # 查看类型

输出成果为:

runoob
runoob
<class 'str'>

毗连池

redis-py 利用 connection pool 来办理对一个 redis server 的所有毗连,避免每次成立、释放毗连的开销。

默认,每个Redis实例城市维护一个本身的毗连池。能够间接成立一个毗连池,然后作为参数 Redis,如许就能够实现多个 Redis 实例共享一个毗连池。

实例

import redis    # 导入redis 模块

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
r.set('name', 'runoob')  # 设置 name 对应的值
print(r.get('name'))  # 取出键 name 对应的值

redis 根基号令 String

set(name, value, ex=None, px=None, nx=False, xx=False)

在 Redis 中设置值,默认,不具有则建立,具有则点窜。

参数:

  • ex - 过时时间(秒)
  • px - 过时时间(毫秒)
  • nx - 若是设置为True,则只要name不具有时,当前set操作才施行
  • xx - 若是设置为True,则只要name具有时,当前set操作才施行

1.ex - 过时时间(秒) 这里过时时间是3秒,3秒后p,键food的值就变成None

实例

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'mutton', ex=3)    # key是"food" value是"mutton" 将键值对存入redis缓存
print(r.get('food'))  # mutton 取出键food对应的值

2.px - 过时时间(豪秒) 这里过时时间是3豪秒,3毫秒后,键foo的值就变成None

实例

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'beef', px=3)
print(r.get('food'))

3.nx - 若是设置为True,则只要name不具有时,当前set操作才施行 (新建)

实例

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r.set('fruit', 'watermelon', nx=True))    # True--不具有
# 若是键fruit不具有,那么输出是True;若是键fruit曾经具有,输出是None

4.xx - 若是设置为True,则只要name具有时,当前set操作才施行 (点窜)

实例

print((r.set('fruit', 'watermelon', xx=True)))   # True--曾经具有
# 若是键fruit曾经具有,那么输出是True;若是键fruit不具有,输出是None

5.setnx(name, value)

设置值,只要name不具有时,施行设置操作(添加)

print(r.setnx('fruit1', 'banana'))  # fruit1不具有,输出为True

6.setex(name, time, value)

设置值

参数:

time - 过时时间(数字秒 或 timedelta对象)

实例

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.setex("fruit2", 5, "orange")
time.sleep(5)
print(r.get('fruit2'))  # 5秒后,取值就从orange变成None

7.psetex(name, time_ms, value)

设置值

参数:

time_ms - 过时时间(数字毫秒 或 timedelta对象)

实例

r.psetex("fruit3", 5000, "apple")
time.sleep(5)
print(r.get('fruit3'))  # 5000毫秒后,取值就从apple变成None

8.mset(*args, **kwargs)

批量设置值

如:

实例

r.mget({'k1': 'v1', 'k2': 'v2'})
r.mset(k1="v1", k2="v2") # 这里k1 和k2 不克不及带引号 一次设置对个键值对
print(r.mget("k1", "k2"))   # 一次取出多个键对应的值
print(r.mget("k1"))

9.mget(keys, *args)

批量获取

如:

实例

print(r.mget('k1', 'k2'))
print(r.mget(['k1', 'k2']))
print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2"))  # 将目前redis缓存中的键对应的值批量取出来

10.getset(name, value)

设置新值并获取本来的值

print(r.getset("food", "barbecue"))  # 设置的新值是barbecue 设置前的值是beef

11.getrange(key, start, end)

获取子序列(按照字节获取,非字符)

参数:

  • name - Redis 的 name
  • start - 起始位置(字节)
  • end - 竣事位置(字节)

如: "君惜大大" ,0-3暗示 "君"

实例

r.set("cn_name", "君惜大大") # 汉字
print(r.getrange("cn_name", 0, 2))   # 取索引号是0-2 前3位的字节 君 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("cn_name", 0, -1))  # 取所有的字节 君惜大大 切片操作
r.set("en_name","junxi") # 字母
print(r.getrange("en_name", 0, 2))  # 取索引号是0-2 前3位的字节 jun 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("en_name", 0, -1)) # 取所有的字节 junxi 切片操作

12.setrange(name, offset, value)

点窜字符串内容,从指定字符串索引起头向后替代(新值太长时,则向后添加)

参数:

  • offset - 字符串的索引,字节(一个汉字三个字节)
  • value - 要设置的值

实例

r.setrange("en_name", 1, "ccc")
print(r.get("en_name"))    # jccci 原始值是junxi 从索引号是1起头替代成ccc 变成 jccci

13.setbit(name, offset, value)

对 name 对应值的二进制暗示的位进行操作

参数:

  • name - redis的name
  • offset - 位的索引(将值变换成二进制后再进行索引)
  • value - 值只能是 1 或 0

注:若是在Redis中有一个对应: n1 = "foo",

那么字符串foo的二进制暗示为:01100110 01101111 01101111

所以,若是施行 setbit('n1', 7, 1),则就会将第7位设置为1,

那么最终二进制则变成 01100111 01101111 01101111,即:"goo"

扩展,转换二进制暗示:

实例

source = "陈思维"
source = "foo"
for i in source:
num = ord(i)
print bin(num).replace('b','')

出格的,若是source是汉字 "陈思维"怎样办?

答:对于utf-8,每一个汉字占 3 个字节,那么 "陈思维" 则有 9个字节 对于汉字,for轮回时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000

14.getbit(name, offset)

获取name对应的值的二进制暗示中的某位的值 (0或1)

print(r.getbit("foo1", 0)) # 0 foo1 对应的二进制 4个字节 32位 第0位是0仍是1

15.bitcount(key, start=None, end=None)

获取name对应的值的二进制暗示中 1 的个数

参数:

  • key - Redis的name
  • start - 字节起始位置
  • end - 字节竣事位置

实例

print(r.get("foo"))  # goo1 01100111
print(r.bitcount("foo",0,1))  # 11 暗示前2个字节中,1呈现的个数

16.bitop(operation, dest, *keys)

获取多个值,并将值做位运算,将最初的成果保留至新的name对应的值

参数:

  • operation - AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
  • dest - 新的Redis的name
  • *keys - 要查找的Redis的name

如:

bitop("AND", 'new_name', 'n1', 'n2', 'n3')

获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将成果保留 new_name 对应的值中

实例

r.set("foo","1")  # 0110001
r.set("foo1","2")  # 0110010
print(r.mget("foo","foo1"))  # ['goo1', 'baaanew']
print(r.bitop("AND","new","foo","foo1"))  # "new" 0 0110000
print(r.mget("foo","foo1","new"))

source = "12"
for i in source:
num = ord(i)
print(num)  # 打印每个字母字符或者汉字字符对应的ascii码值 f-102-0b100111-01100111
print(bin(num))  # 打印每个10进制ascii码值转换成二进制的值 0b1100110(0b暗示二进制)
print bin(num).replace('b','')  # 将二进制0b1100110替代成01100110

17.strlen(name)

前往name对应值的字节长度(一个汉字3个字节)

print(r.strlen("foo"))  # 4 'goo1'的长度是4

18.incr(self, name, amount=1)

自增 name 对应的值,当 name 不具有时,则建立 name=amount,不然,则自增。

参数:

  • name - Redis的name
  • amount - 自增数(必需是整数)

注:同 incrby

实例

r.set("foo", 123)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))
r.incr("foo", amount=1)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))

使用场景 – 页面点击数

假定我们对一系列页面需要记实点击次数。例如论坛的每个帖子都要记实点击次数,而点击次数比回帖的次数的多得多。若是利用关系数据库来存储点击,可能具有大量的行级锁争用。所以,点击数的添加利用redis的INCR号令最好不外了。

当redis办事器启动时,能够从关系数据库读入点击数的初始值(12306这个页面被拜候了34634次)

r.set("visit:12306:totals", 34634)
print(r.get("visit:12306:totals"))

每当有一个页面点击,则利用INCR添加点击数即可。

r.incr("visit:12306:totals")
r.incr("visit:12306:totals")

页面载入的时候则可间接获取这个值

print(r.get("visit:12306:totals"))

19.incrbyfloat(self, name, amount=1.0)

自增 name对应的值,当name不具有时,则建立name=amount,不然,则自增。

参数:

  • name - Redis的name
  • amount - 自增数(浮点型)

实例

r.set("foo1", "123.0")
r.set("foo2", "221.0")
print(r.mget("foo1", "foo2"))
r.incrbyfloat("foo1", amount=2.0)
r.incrbyfloat("foo2", amount=3.0)
print(r.mget("foo1", "foo2"))

20.decr(self, name, amount=1)

自减 name 对应的值,当 name 不具有时,则建立 name=amount,不然,则自减。

参数:

  • name - Redis的name
  • amount - 自减数(整数)

实例

r.decr("foo4", amount=3) # 递减3
r.decr("foo1", amount=1) # 递减1
print(r.mget("foo1", "foo4"))

21.append(key, value)

在redis name对应的值后面追加内容

参数:

  • key - redis的name
  • value - 要追加的字符串

实例

r.append("name", "haha")    # 在name对应的值junxi后面追加字符串haha
print(r.mget("name"))

redis 根基号令 hash

1、单个添加--点窜(单个取出)--没有就新增,有的话就点窜

hset(name, key, value)

name对应的hash中设置一个键值对(不具有,则建立;不然,点窜)

参数:

  • name - redis的name
  • key - name对应的hash中的key
  • value - name对应的hash中的value

注:hsetnx(name, key, value) 当name对应的hash中不具有当前key时则建立(相当于添加)

实例

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hkeys("hash1")) # 取hash中所有的key
print(r.hget("hash1", "k1"))    # 单个取hash的key对应的值
print(r.hmget("hash1", "k1", "k2")) # 多个取hash的key对应的值
r.hsetnx("hash1", "k2", "v3") # 只能新建
print(r.hget("hash1", "k2"))

2、批量添加(取出)

hmset(name, mapping)

在name对应的hash中批量设置键值对

参数:

  • name - redis的name
  • mapping - 字典,如:{'k1':'v1', 'k2': 'v2'}

如:

实例

r.hmset("hash2", {"k2": "v2", "k3": "v3"})
hget(name,key)

在name对应的hash中获取按照key获取value

hmget(name, keys, *args)

在name对应的hash中获取多个key的值

参数:

  • name - reids对应的name
  • keys - 要获取key调集,如:['k1', 'k2', 'k3']
  • *args - 要获取的key,如:k1,k2,k3

如:

实例

print(r.hget("hash2", "k2"))  # 单个取出"hash2"的key-k2对应的value
print(r.hmget("hash2", "k2", "k3"))  # 批量取出"hash2"的key-k2 k3对应的value --体例1
print(r.hmget("hash2", ["k2", "k3"]))  # 批量取出"hash2"的key-k2 k3对应的value --体例2

3、取出所有的键值对

hgetall(name)

获取name对应hash的所有键值

print(r.hgetall("hash1"))

4、获得所有键值对的格局 hash长度

hlen(name)

获取name对应的hash中键值对的个数

print(r.hlen("hash1"))

5、获得所有的keys(雷同字典的取所有keys)

hkeys(name)

获取name对应的hash中所有的key的值

print(r.hkeys("hash1"))

6、获得所有的value(雷同字典的取所有value)

hvals(name)

获取name对应的hash中所有的value的值

print(r.hvals("hash1"))

7、判断成员能否具有(雷同字典的in)

hexists(name, key)

查抄 name 对应的 hash 能否具有当前传入的 key

实例

print(r.hexists("hash1", "k4"))  # False 不具有
print(r.hexists("hash1", "k1"))  # True 具有

8、删除键值对

hdel(name,*keys)

将name对应的hash中指定key的键值对删除

实例

print(r.hgetall("hash1"))
r.hset("hash1", "k2", "v222")   # 点窜已有的key k2
r.hset("hash1", "k11", "v1")   # 新增键值对 k11
r.hdel("hash1", "k1")    # 删除一个键值对
print(r.hgetall("hash1"))

9、自增自减整数(将key对应的value--整数 自增1或者2,或者此外整数 负数就是自减)

hincrby(name, key, amount=1)

自增name对应的hash中的指定key的值,不具有则建立key=amount

参数:

  • name - redis中的name
  • key - hash对应的key
  • amount - 自增数(整数)

实例

r.hset("hash1", "k3", 123)
r.hincrby("hash1", "k3", amount=-1)
print(r.hgetall("hash1"))
r.hincrby("hash1", "k4", amount=1)  # 不具有的话,value默认就是1
print(r.hgetall("hash1"))

10、自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,或者此外浮点数 负数就是自减)

hincrbyfloat(name, key, amount=1.0)

自增name对应的hash中的指定key的值,不具有则建立key=amount

参数:

  • name - redis中的name
  • key - hash对应的key
  • amount,自增数(浮点数)

自增 name 对应的 hash 中的指定 key 的值,不具有则建立 key=amount。

实例

r.hset("hash1", "k5", "1.0")
r.hincrbyfloat("hash1", "k5", amount=-1.0)    # 曾经具有,递减-1.0
print(r.hgetall("hash1"))
r.hincrbyfloat("hash1", "k6", amount=-1.0)    # 不具有,value初始值是-1.0 每次递减1.0
print(r.hgetall("hash1"))

11、取值查看--分片读取

hscan(name, cursor=0, match=None, count=None)

增量式迭代获取,对于数据大的数据很是有用,hscan能够实现分片的获取数据,并非一次性将数据全数获取完,从而放置内存被撑爆

参数:

  • name - redis的name
  • cursor - 游标(基于游标分批取获取数据)
  • match - 婚配指定key,默认None 暗示所有的key
  • count - 每次分片起码获取个数,默认None暗示采用Redis的默认分片个数

如:

第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
...

直到前往值cursor的值为0时,暗示数据曾经通过度片获取完毕

print(r.hscan("hash1"))

12、hscan_iter(name, match=None, count=None)

操纵yield封装hscan建立生成器,实现分批去redis中获取数据

参数:

  • match - 婚配指定key,默认None 暗示所有的key
  • count - 每次分片起码获取个数,默认None暗示采用Redis的默认分片个数

如:

实例

for item in r.hscan_iter

本章节我们将为大师引见 Python 若何操作 redis,redis 是一个 Key-Value 数据库,Value 支撑 string(字符串),list(列表),set(调集),zset(有序调集),hash(哈希类型)等类型。

关于 redis 的更多内容能够参考我们的 redis 教程,留意在进修本章节之前你要确保你的 redis 办事曾经安装。

redis 启动界面如下:

启动 redis

$ ./redis-server
75858:C 25 Oct 11:43:34.329 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
75858:M 25 Oct 11:43:34.331 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                            
      _.-``    `.  `_.  ''-._           Redis 3.0.3 (255fcb1a/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'
` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'
   |     PID: 75858
  `-._    `-._  `-./  _.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'
_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'
_.-'    _.-'                                  
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'
_.-'    |                                  
  `-._    `-._`-.__.-'
_.-'    _.-'                                  
      `-._    `-.__.-'    _.-'                                      
          `-._        _.-'                                          
              `-.__.-'
                                             

75858:M 25 Oct 11:43:34.337 # Server started, Redis version 3.0.3
75858:M 25 Oct 11:43:34.339 * DB loaded from disk: 0.002 seconds
75858:M 25 Oct 11:43:34.339 * The server is now ready to accept connections on port 6379

能够看到默认端标语为 6379


安装 redis 模块

Python 要利用 redis,需要先安装 redis 模块:

sudo pip3 install redis
或
sudo easy_install redis
或
sudo python setup.py install

源码地址:https://github.com/WoLpH/redis-py

测试能否安装成功:

>>> import redis
>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)
>>> r.set('foo', 'bar')
True
>>> r.get('foo')
'bar'

redis 供给两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部门官方的号令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。

redis 取出的成果默认是字节,我们能够设定 decode_responses=True 改成字符串。

实例

import redis   # 导入redis 模块

r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
r.set('name', 'runoob')  # 设置 name 对应的值
print(r['name'])
print(r.get('name'))  # 取出键 name 对应的值
print(type(r.get('name')))  # 查看类型

输出成果为:

runoob
runoob
<class 'str'>

毗连池

redis-py 利用 connection pool 来办理对一个 redis server 的所有毗连,避免每次成立、释放毗连的开销。

默认,每个Redis实例城市维护一个本身的毗连池。能够间接成立一个毗连池,然后作为参数 Redis,如许就能够实现多个 Redis 实例共享一个毗连池。

实例

import redis    # 导入redis 模块

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
r.set('name', 'runoob')  # 设置 name 对应的值
print(r.get('name'))  # 取出键 name 对应的值

redis 根基号令 String

set(name, value, ex=None, px=None, nx=False, xx=False)

在 Redis 中设置值,默认,不具有则建立,具有则点窜。

参数:

  • ex - 过时时间(秒)
  • px - 过时时间(毫秒)
  • nx - 若是设置为True,则只要name不具有时,当前set操作才施行
  • xx - 若是设置为True,则只要name具有时,当前set操作才施行

1.ex - 过时时间(秒) 这里过时时间是3秒,3秒后p,键food的值就变成None

实例

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'mutton', ex=3)    # key是"food" value是"mutton" 将键值对存入redis缓存
print(r.get('food'))  # mutton 取出键food对应的值

2.px - 过时时间(豪秒) 这里过时时间是3豪秒,3毫秒后,键foo的值就变成None

实例

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('food', 'beef', px=3)
print(r.get('food'))

3.nx - 若是设置为True,则只要name不具有时,当前set操作才施行 (新建)

实例

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
print(r.set('fruit', 'watermelon', nx=True))    # True--不具有
# 若是键fruit不具有,那么输出是True;若是键fruit曾经具有,输出是None

4.xx - 若是设置为True,则只要name具有时,当前set操作才施行 (点窜)

实例

print((r.set('fruit', 'watermelon', xx=True)))   # True--曾经具有
# 若是键fruit曾经具有,那么输出是True;若是键fruit不具有,输出是None

5.setnx(name, value)

设置值,只要name不具有时,施行设置操作(添加)

print(r.setnx('fruit1', 'banana'))  # fruit1不具有,输出为True

6.setex(name, time, value)

设置值

参数:

time - 过时时间(数字秒 或 timedelta对象)

实例

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.setex("fruit2", 5, "orange")
time.sleep(5)
print(r.get('fruit2'))  # 5秒后,取值就从orange变成None

7.psetex(name, time_ms, value)

设置值

参数:

time_ms - 过时时间(数字毫秒 或 timedelta对象)

实例

r.psetex("fruit3", 5000, "apple")
time.sleep(5)
print(r.get('fruit3'))  # 5000毫秒后,取值就从apple变成None

8.mset(*args, **kwargs)

批量设置值

如:

实例

r.mget({'k1': 'v1', 'k2': 'v2'})
r.mset(k1="v1", k2="v2") # 这里k1 和k2 不克不及带引号 一次设置对个键值对
print(r.mget("k1", "k2"))   # 一次取出多个键对应的值
print(r.mget("k1"))

9.mget(keys, *args)

批量获取

如:

实例

print(r.mget('k1', 'k2'))
print(r.mget(['k1', 'k2']))
print(r.mget("fruit", "fruit1", "fruit2", "k1", "k2"))  # 将目前redis缓存中的键对应的值批量取出来

10.getset(name, value)

设置新值并获取本来的值

print(r.getset("food", "barbecue"))  # 设置的新值是barbecue 设置前的值是beef

11.getrange(key, start, end)

获取子序列(按照字节获取,非字符)

参数:

  • name - Redis 的 name
  • start - 起始位置(字节)
  • end - 竣事位置(字节)

如: "君惜大大" ,0-3暗示 "君"

实例

r.set("cn_name", "君惜大大") # 汉字
print(r.getrange("cn_name", 0, 2))   # 取索引号是0-2 前3位的字节 君 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("cn_name", 0, -1))  # 取所有的字节 君惜大大 切片操作
r.set("en_name","junxi") # 字母
print(r.getrange("en_name", 0, 2))  # 取索引号是0-2 前3位的字节 jun 切片操作 (一个汉字3个字节 1个字母一个字节 每个字节8bit)
print(r.getrange("en_name", 0, -1)) # 取所有的字节 junxi 切片操作

12.setrange(name, offset, value)

点窜字符串内容,从指定字符串索引起头向后替代(新值太长时,则向后添加)

参数:

  • offset - 字符串的索引,字节(一个汉字三个字节)
  • value - 要设置的值

实例

r.setrange("en_name", 1, "ccc")
print(r.get("en_name"))    # jccci 原始值是junxi 从索引号是1起头替代成ccc 变成 jccci

13.setbit(name, offset, value)

对 name 对应值的二进制暗示的位进行操作

参数:

  • name - redis的name
  • offset - 位的索引(将值变换成二进制后再进行索引)
  • value - 值只能是 1 或 0

注:若是在Redis中有一个对应: n1 = "foo",

那么字符串foo的二进制暗示为:01100110 01101111 01101111

所以,若是施行 setbit('n1', 7, 1),则就会将第7位设置为1,

那么最终二进制则变成 01100111 01101111 01101111,即:"goo"

扩展,转换二进制暗示:

实例

source = "陈思维"
source = "foo"
for i in source:
num = ord(i)
print bin(num).replace('b','')

出格的,若是source是汉字 "陈思维"怎样办?

答:对于utf-8,每一个汉字占 3 个字节,那么 "陈思维" 则有 9个字节 对于汉字,for轮回时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000

14.getbit(name, offset)

获取name对应的值的二进制暗示中的某位的值 (0或1)

print(r.getbit("foo1", 0)) # 0 foo1 对应的二进制 4个字节 32位 第0位是0仍是1

15.bitcount(key, start=None, end=None)

获取name对应的值的二进制暗示中 1 的个数

参数:

  • key - Redis的name
  • start - 字节起始位置
  • end - 字节竣事位置

实例

print(r.get("foo"))  # goo1 01100111
print(r.bitcount("foo",0,1))  # 11 暗示前2个字节中,1呈现的个数

16.bitop(operation, dest, *keys)

获取多个值,并将值做位运算,将最初的成果保留至新的name对应的值

参数:

  • operation - AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)
  • dest - 新的Redis的name
  • *keys - 要查找的Redis的name

如:

bitop("AND", 'new_name', 'n1', 'n2', 'n3')

获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将成果保留 new_name 对应的值中

实例

r.set("foo","1")  # 0110001
r.set("foo1","2")  # 0110010
print(r.mget("foo","foo1"))  # ['goo1', 'baaanew']
print(r.bitop("AND","new","foo","foo1"))  # "new" 0 0110000
print(r.mget("foo","foo1","new"))

source = "12"
for i in source:
num = ord(i)
print(num)  # 打印每个字母字符或者汉字字符对应的ascii码值 f-102-0b100111-01100111
print(bin(num))  # 打印每个10进制ascii码值转换成二进制的值 0b1100110(0b暗示二进制)
print bin(num).replace('b','')  # 将二进制0b1100110替代成01100110

17.strlen(name)

前往name对应值的字节长度(一个汉字3个字节)

print(r.strlen("foo"))  # 4 'goo1'的长度是4

18.incr(self, name, amount=1)

自增 name 对应的值,当 name 不具有时,则建立 name=amount,不然,则自增。

参数:

  • name - Redis的name
  • amount - 自增数(必需是整数)

注:同 incrby

实例

r.set("foo", 123)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))
r.incr("foo", amount=1)
print(r.mget("foo", "foo1", "foo2", "k1", "k2"))

使用场景 – 页面点击数

假定我们对一系列页面需要记实点击次数。例如论坛的每个帖子都要记实点击次数,而点击次数比回帖的次数的多得多。若是利用关系数据库来存储点击,可能具有大量的行级锁争用。所以,点击数的添加利用redis的INCR号令最好不外了。

当redis办事器启动时,能够从关系数据库读入点击数的初始值(12306这个页面被拜候了34634次)

r.set("visit:12306:totals", 34634)
print(r.get("visit:12306:totals"))

每当有一个页面点击,则利用INCR添加点击数即可。

r.incr("visit:12306:totals")
r.incr("visit:12306:totals")

页面载入的时候则可间接获取这个值

print(r.get("visit:12306:totals"))

19.incrbyfloat(self, name, amount=1.0)

自增 name对应的值,当name不具有时,则建立name=amount,不然,则自增。

参数:

  • name - Redis的name
  • amount - 自增数(浮点型)

实例

r.set("foo1", "123.0")
r.set("foo2", "221.0")
print(r.mget("foo1", "foo2"))
r.incrbyfloat("foo1", amount=2.0)
r.incrbyfloat("foo2", amount=3.0)
print(r.mget("foo1", "foo2"))

20.decr(self, name, amount=1)

自减 name 对应的值,当 name 不具有时,则建立 name=amount,不然,则自减。

参数:

  • name - Redis的name
  • amount - 自减数(整数)

实例

r.decr("foo4", amount=3) # 递减3
r.decr("foo1", amount=1) # 递减1
print(r.mget("foo1", "foo4"))

21.append(key, value)

在redis name对应的值后面追加内容

参数:

  • key - redis的name
  • value - 要追加的字符串

实例

r.append("name", "haha")    # 在name对应的值junxi后面追加字符串haha
print(r.mget("name"))

redis 根基号令 hash

1、单个添加--点窜(单个取出)--没有就新增,有的话就点窜

hset(name, key, value)

name对应的hash中设置一个键值对(不具有,则建立;不然,点窜)

参数:

  • name - redis的name
  • key - name对应的hash中的key
  • value - name对应的hash中的value

注:hsetnx(name, key, value) 当name对应的hash中不具有当前key时则建立(相当于添加)

实例

import redis
import time

pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)

r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hkeys("hash1")) # 取hash中所有的key
print(r.hget("hash1", "k1"))    # 单个取hash的key对应的值
print(r.hmget("hash1", "k1", "k2")) # 多个取hash的key对应的值
r.hsetnx("hash1", "k2", "v3") # 只能新建
print(r.hget("hash1", "k2"))

2、批量添加(取出)

hmset(name, mapping)

在name对应的hash中批量设置键值对

参数:

  • name - redis的name
  • mapping - 字典,如:{'k1':'v1', 'k2': 'v2'}

如:

实例

r.hmset("hash2", {"k2": "v2", "k3": "v3"})
hget(name,key)

在name对应的hash中获取按照key获取value

hmget(name, keys, *args)

在name对应的hash中获取多个key的值

参数:

  • name - reids对应的name
  • keys - 要获取key调集,如:['k1', 'k2', 'k3']
  • *args - 要获取的key,如:k1,k2,k3

如:

实例

print(r.hget("hash2", "k2"))  # 单个取出"hash2"的key-k2对应的value
print(r.hmget("hash2", "k2", "k3"))  # 批量取出"hash2"的key-k2 k3对应的value --体例1
print(r.hmget("hash2", ["k2", "k3"]))  # 批量取出"hash2"的key-k2 k3对应的value --体例2

3、取出所有的键值对

hgetall(name)

获取name对应hash的所有键值

print(r.hgetall("hash1"))

4、获得所有键值对的格局 hash长度

hlen(name)

获取name对应的hash中键值对的个数

print(r.hlen("hash1"))

5、获得所有的keys(雷同字典的取所有keys)

hkeys(name)

获取name对应的hash中所有的key的值

print(r.hkeys("hash1"))

6、获得所有的value(雷同字典的取所有value)

hvals(name)

获取name对应的hash中所有的value的值

print(r.hvals("hash1"))

7、判断成员能否具有(雷同字典的in)

hexists(name, key)

查抄 name 对应的 hash 能否具有当前传入的 key

实例

print(r.hexists("hash1", "k4"))  # False 不具有
print(r.hexists("hash1", "k1"))  # True 具有

8、删除键值对

hdel(name,*keys)

将name对应的hash中指定key的键值对删除

实例

print(r.hgetall("hash1"))
r.hset("hash1", "k2", "v222")   # 点窜已有的key k2
r.hset("hash1", "k11", "v1")   # 新增键值对 k11
r.hdel("hash1", "k1")    # 删除一个键值对
print(r.hgetall("hash1"))

9、自增自减整数(将key对应的value--整数 自增1或者2,或者此外整数 负数就是自减)

hincrby(name, key, amount=1)

自增name对应的hash中的指定key的值,不具有则建立key=amount

参数:

  • name - redis中的name
  • key - hash对应的key
  • amount - 自增数(整数)

实例

r.hset("hash1", "k3", 123)
r.hincrby("hash1", "k3", amount=-1)
print(r.hgetall("hash1"))
r.hincrby("hash1", "k4", amount=1)  # 不具有的话,value默认就是1
print(r.hgetall("hash1"))

10、自增自减浮点数(将key对应的value--浮点数 自增1.0或者2.0,或者此外浮点数 负数就是自减)

hincrbyfloat(name, key, amount=1.0)

自增name对应的hash中的指定key的值,不具有则建立key=amount

参数:

  • name - redis中的name
  • key - hash对应的key
  • amount,自增数(浮点数)

自增 name 对应的 hash 中的指定 key 的值,不具有则建立 key=amount。

实例

r.hset("hash1", "k5", "1.0")
r.hincrbyfloat("hash1", "k5", amount=-1.0)    # 曾经具有,递减-1.0
print(r.hgetall("hash1"))
r.hincrbyfloat("hash1", "k6", amount=-1.0)    # 不具有,value初始值是-1.0 每次递减1.0
print(r.hgetall("hash1"))

11、取值查看--分片读取

hscan(name, cursor=0, match=None, count=None)

增量式迭代获取,对于数据大的数据很是有用,hscan能够实现分片的获取数据,并非一次性将数据全数获取完,从而放置内存被撑爆

参数:

  • name - redis的name
  • cursor - 游标(基于游标分批取获取数据)
  • match - 婚配指定key,默认None 暗示所有的key
  • count - 每次分片起码获取个数,默认None暗示采用Redis的默认分片个数

如:

第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
...

直到前往值cursor的值为0时,暗示数据曾经通过度片获取完毕

print(r.hscan("hash1"))

12、hscan_iter(name, match=None, count=None)

操纵yield封装hscan建立生成器,实现分批去redis中获取数据

参数:

  • match - 婚配指定key,默认None 暗示所有的key
  • count - 每次分片起码获取个数,默认None暗示采用Redis的默认分片个数

如: