1. 安装redis

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

2. 测试是否安装成功

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

3. redis 连接

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'>

4. 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 对应的值
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对应的值

5. 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
import redis

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

# ex
r.set('food', 'mutton', ex=3)    # key是"food" value是"mutton" 将键值对存入redis缓存

# px
r.set('food', 'beef', px=3)

# nx - 如果设置为True,则只有name不存在时,当前set操作才执行 (新建)
print(r.set('fruit', 'watermelon', nx=True))    # True--不存在

# xx - 如果设置为True,则只有name存在时,当前set操作才执行 (修改)
print((r.set('fruit', 'watermelon', xx=True)))   # True--已经存在

# setnx(name, value) 设置值,只有name不存在时,执行设置操作(添加)
print(r.setnx('fruit1', 'banana'))  # fruit1不存在,输出为True


# setex(name, time, value) 设置值 参数:time - 过期时间(数字秒 或 timedelta对象)
r.setex("fruit2", 5, "orange")
time.sleep(5)
print(r.get('fruit2'))  # 5秒后,取值就从orange变成None

# psetex(name, time_ms, value) 设置值 参数: time_ms - 过期时间(数字毫秒 或 timedelta对象)
r.psetex("fruit3", 5000, "apple")
time.sleep(5)
print(r.get('fruit3'))  # 5000毫秒后,取值就从apple变成None

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

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

# getset(name, value) 设置新值并获取原来的值
print(r.getset("food", "barbecue"))  # 设置的新值是barbecue 设置前的值是beef

# strlen(name)  返回name对应值的字节长度(一个汉字3个字节)
print(r.strlen("foo"))  # 4 'goo1'的长度是4


# incr(self, name, amount=1) 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。每当有一个页面点击,则使用INCR增加点击数即可。
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"))

# decr(self, name, amount=1)自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。
r.decr("foo4", amount=3) # 递减3
r.decr("foo1", amount=1) # 递减1
print(r.mget("foo1", "foo4"))

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

6. redis 基本命令 hash

import redis
import time

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

# 1、hset(name, key, value)单个增加--修改(单个取出)--没有就新增,有的话就修改 
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"))


# hmset(name, mapping) 批量增加(取出)
r.hmset("hash2", {"k2": "v2", "k3": "v3"})

# hmget(name, keys, *args)  在name对应的hash中获取根据key获取value
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

# hgetall(name) 获取name对应hash的所有键值
print(r.hgetall("hash1"))

# hlen(name)得到所有键值对的格式 hash长度
print(r.hlen("hash1"))

# hkeys(name)得到所有的keys(类似字典的取所有keys)获取name对应的hash中所有的key的值
print(r.hkeys("hash1"))
# hvals(name) 得到所有的value(类似字典的取所有value)获取name对应的hash中所有的value的值
print(r.hvals("hash1"))

# hexists(name, key) 检查 name 对应的 hash 是否存在当前传入的 key
print(r.hexists("hash1", "k4"))  # False 不存在
print(r.hexists("hash1", "k1"))  # True 存在

# 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"))

7. redis基本命令 list

import redis
import time

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

# lpush(name,values) 增加(类似于list的append,只是这里是从左边新增加)--没有就新建
r.lpush("list1", 11, 22, 33)  # 保存顺序为: 33,22,11
print(r.lrange('list1', 0, -1))

# r.rpush增加(从右边增加)--没有就新建
r.rpush("list2", 11, 22, 33)  # 表示从右向左操作
print(r.llen("list2"))  # 列表长度
print(r.lrange("list2", 0, 3))  # 切片取出值,范围是索引号0-3

8. redis基本命令 set

# sadd(name,values) 新增 name - 对应的集合中添加元素
r.sadd("set1", 33, 44, 55, 66)  # 往集合中添加元素
print(r.scard("set1"))  # 集合的长度是4
print(r.smembers("set1"))   # 获取集合中所有的成员


# scard(name) 获取元素个数 类似于len 获取name对应的集合中元素个数
print(r.scard("set1"))  # 集合的长度是4

# smembers(name) 获取集合中所有的成员 获取name对应的集合的所有成员
print(r.smembers("set1"))   # 获取集合中所有的成员

# sscan(name, cursor=0, match=None, count=None) 获取集合中所有的成员--元组形式
print(r.sscan("set1"))

# sscan_iter(name, match=None, count=None) 获取集合中所有的成员--迭代器的方式 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大
for i in r.sscan_iter("set1"):
    print(i)

# sdiff(keys, *args) 差集 在第一个name对应的集合中且不在其他name对应的集合的元素集合
r.sadd("set2", 11, 22, 33)
print(r.smembers("set1"))   # 获取集合中所有的成员
print(r.smembers("set2"))
print(r.sdiff("set1", "set2"))   # 在集合set1但是不在集合set2中
print(r.sdiff("set2", "set1"))   # 在集合set2但是不在集合set1中

# sdiffstore(dest, keys, *args) 差集--差集存在一个新的集合中 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
r.sdiffstore("set3", "set1", "set2")    # 在集合set1但是不在集合set2中
print(r.smembers("set3"))   # 获取集合3中所有的成员

# sinter(keys, *args) 交集 获取多一个name对应集合的交集
print(r.sinter("set1", "set2")) # 取2个集合的交集

# sinterstore(dest, keys, *args) 交集--交集存在一个新的集合中 获取多一个name对应集合的并集,再将其加入到dest对应的集合中
print(r.sinterstore("set3", "set1", "set2")) # 取2个集合的交集
print(r.smembers("set3"))

# sunion(keys, *args) 并集 获取多个name对应的集合的并集
print(r.sunion("set1", "set2")) # 取2个集合的并集

# sunionstore(dest,keys, *args) 并集--并集存在一个新的集合 获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中
print(r.sunionstore("set3", "set1", "set2")) # 取2个集合的并集
print(r.smembers("set3"))

9. redis基本命令 有序set

import redis
import time

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

# 1.zadd(name, *args, **kwargs) 新增
r.zadd("zset1", n1=11, n2=22)
r.zadd("zset2", 'm1', 22, 'm2', 44)
print(r.zcard("zset1")) # 集合长度
print(r.zcard("zset2")) # 集合长度
print(r.zrange("zset1", 0, -1))   # 获取有序集合中所有元素
print(r.zrange("zset2", 0, -1, withscores=True))   # 获取有序集合中所有元素和分数

# zcard(name) 获取有序集合元素个数 类似于len 获取name对应的有序集合元素的数量
print(r.zcard("zset1")) # 集合长度

# r.zrange( name, start, end, desc=False, withscores=False,  获取有序集合的所有元素
score_cast_func=float)