Redis数据类型+Python与redis的交互
- 1. Redis 五大数据类型
- 1.1 String类型
- 1.2 List类型
- 1.3 Hash类型
- 1.4 Set类型
- 1.5 Zset类型
- 2. Python和redis的交互
- 2.1 基本思路
- 2.2 示例代码
1. Redis 五大数据类型
1.1 String类型
一个key对应一个value,value的类型为string。
在终端中的使用如下:
127.0.0.1:6379> set name test # key:name value:test
OK
127.0.0.1:6379> get name # 获取key="name"的值
"test"
127.0.0.1:6379> mset age 18 home shanghai # 设置多个key
OK
127.0.0.1:6379> mget age home # 获取多个key的值
1) "18"
2) "shanghai"
127.0.0.1:6379> append name 123 # 追加name的值
(integer) 7 # 不会直接返回结果, 返回name的长度
127.0.0.1:6379> get name # 再次查看name的值
"test123"
127.0.0.1:6379> strlen name # 用命令查询name的长度
(integer) 7
127.0.0.1:6379> del name # 删除key=name的数据
(integer) 1
127.0.0.1:6379> keys * # 查看现有的key
1) "age"
2) "home"
127.0.0.1:6379> incr age # age加1
(integer) 19
127.0.0.1:6379> incr age # age加1
(integer) 20
127.0.0.1:6379> incrby age 2 # incrby key num, 让对应的key值加任意数
(integer) 22
127.0.0.1:6379> decr age # age减1
(integer) 21
127.0.0.1:6379> decr age # age减1
(integer) 20
127.0.0.1:6379> decrby age 2 # age减2
(integer) 18
127.0.0.1:6379> getrange home 0 3 # 获取某一部分元素,索引为3的字母n也会被获取,与Python语言不同
"shan"
127.0.0.1:6379> getrange home 0 -1 # 获取所有的元素
"shanghai"
127.0.0.1:6379> setrange home 0 abc # 从第几个元素开始进行替换,若替换的元素大于被替换的元素会依次往后进行替换
(integer) 8
127.0.0.1:6379> get home # 查看替换后的home
"abcnghai"
1.2 List类型
Redis列表是简单的字符串列表,按照插入顺序排序。
用户可以添加一个元素到列表的头部(左边)或者尾部(右边)。
在终端中的使用如下:
127.0.0.1:6379> lpush li 1 2 3 4 5 # 从左往右推
(integer) 5
127.0.0.1:6379> lrange li 0 -1 # 查看列表li
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpush ls 1 2 3 4 5 # 从右往左推
(integer) 5
127.0.0.1:6379> lrange ls 0 -1 # 查看列表ls
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lpop li # 移除li最左边的元素5
"5"
127.0.0.1:6379> rpop li # 移除li最右边的元素1
"1"
127.0.0.1:6379> lrange li 0 -1 # 再次查看列表li
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> lindex ls 2 # 根据下标获取元素
"3"
127.0.0.1:6379> lpush li 4
(integer) 4
127.0.0.1:6379> lrem li 2 4 # 删除li列表中2个4
(integer) 2
127.0.0.1:6379> lrange li 0 -1
1) "3"
2) "2"
127.0.0.1:6379> rpoplpush li ls
"2"
127.0.0.1:6379> lrange ls 0 -1 # 将li最后一个元素压入到ls中第一个元素
1) "2"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
127.0.0.1:6379> lset ls 0 0 # 将ls中第一个元素替换成0
OK
127.0.0.1:6379> linsert ls before 0 -1 # 在元素0之前插入-1
(integer) 7
127.0.0.1:6379> linsert ls after 5 6 # 在元素5之后插入6
(integer) 8
127.0.0.1:6379> lrange ls 0 -1
1) "-1"
2) "0"
3) "1"
4) "2"
5) "3"
6) "4"
7) "5"
8) "6"
127.0.0.1:6379> ltrim ls 1 4 # 截取ls中1 - 4范围内的元素在重新赋值给ls
OK
127.0.0.1:6379> lrange ls 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
1.3 Hash类型
hash是⼀个键值对集合;
hash是⼀个string类型的field和value的映射表,hash特别适合存储对象。
简单理解,hash类型的值就是一个字典,有属于自己的key-value。
在终端中的使用如下:
127.0.0.1:6379> hset user id 1 # 添加key="user"的hash数据,其值为{id:1}
(integer) 1
127.0.0.1:6379> hget user id # 获取user中key=id的值
"1"
127.0.0.1:6379> hmset user age 18 name jerry # 设置多个值
OK
127.0.0.1:6379> hgetall user # 获取多个值,会把k和v都打印
1) "id"
2) "1"
3) "age"
4) "18"
5) "name"
6) "jerry"
127.0.0.1:6379> hdel user id # 删除user中的id
(integer) 1
127.0.0.1:6379> hgetall user
1) "age"
2) "18"
3) "name"
4) "jerry"
127.0.0.1:6379> hdel user age name # 删除user多个值
(integer) 2
127.0.0.1:6379> hgetall user
(empty list or set)
127.0.0.1:6379> hmset user name jerry age 18 gender true
OK
127.0.0.1:6379> hmget user name age gender # 获取多个值,只打印v
1) "jerry"
2) "18"
3) "true"
127.0.0.1:6379> hexists user id # 判断某个值是否存在,0——不存在,1——存在
(integer) 0
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hkeys user # 获取user的值的所有key
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379> hvals user # 获取user的值的所有value
1) "jerry"
2) "18"
3) "true"
1.4 Set类型
set是string类型的无序不重复集合。
在终端中的使用如下:
127.0.0.1:6379> sadd s1 1 2 2 3 4 4 5 # 添加数据
(integer) 5
127.0.0.1:6379> smembers s1 # 打印集合s1, 不要添加0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sismember s1 1 # 判断某个值是否存在,0——不存在,1——存在
(integer) 1
127.0.0.1:6379> sismember s1 6
(integer) 0
127.0.0.1:6379> scard s1 # 返回元素的个数
(integer) 5
127.0.0.1:6379> srem s1 1 # 删除1这个元素
(integer) 1
127.0.0.1:6379> smembers s1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> srandmember s1 # 随机取值
"3"
127.0.0.1:6379> srandmember s1
"5"
127.0.0.1:6379> spop s1 # 随机删除s1中的元素
"2"
127.0.0.1:6379> sadd s2 6 7 8 9 10
(integer) 5
127.0.0.1:6379> smove s1 s2 3 # 把s1中的3移动到s2里面
(integer) 1
127.0.0.1:6379> smembers s1
1) "4"
2) "5"
127.0.0.1:6379> smembers s2
1) "3"
2) "6"
3) "7"
4) "8"
5) "9"
6) "10"
127.0.0.1:6379> sadd s1 6 7 8 # 给s1添加三个元素
(integer) 3
127.0.0.1:6379> sdiff s1 s2 # s1与s2的差集
1) "4"
2) "5"
127.0.0.1:6379> sdiff s2 s1
1) "3"
2) "9"
3) "10"
1.5 Zset类型
有序不重复,每个元素都会关联一个分数,通过分数来对成员进行一个从小到大的排序。
在终端中的使用如下:
127.0.0.1:6379> zadd z1 70 juran 50 tony 80 cheney 60 jerry 90 amy # 添加元素(需要分数 必填的)
(integer) 5
127.0.0.1:6379> zrange z1 0 -1 # 不带分数,打印集合z1
1) "tony"
2) "jerry"
3) "juran"
4) "cheney"
5) "amy"
127.0.0.1:6379> zrange z1 0 -1 withscores # 带分数,打印集合z1
1) "tony"
2) "50"
3) "jerry"
4) "60"
5) "juran"
6) "70"
7) "cheney"
8) "80"
9) "amy"
10) "90"
127.0.0.1:6379> zrangebyscore z1 60 70 # 根据开始和结束的分数来查询
1) "jerry"
2) "juran"
127.0.0.1:6379> zrangebyscore z1 60 (90 # 根据分数60开始查询到90结束,但不包括90
1) "jerry"
2) "juran"
3) "cheney"
127.0.0.1:6379> zrangebyscore z1 (60 (90 # 根据分数60开始查询到90结束,但不包括60、90
1) "juran"
2) "cheney"
127.0.0.1:6379> zrangebyscore z1 60 90 limit 1 2 # 根据分数60开始查询到90结束,并返回索引为1和2的值
1) "juran"
2) "cheney"
127.0.0.1:6379> zrem z1 tony # 不需要按照分数来删除
(integer) 1
127.0.0.1:6379> zcard z1 # 返回集合中元素的数量
(integer) 4
127.0.0.1:6379> zcount z1 60 90 # 符合条件的个数, 需要加上分数
(integer) 4
127.0.0.1:6379> zrank z1 jerry # 返回元素的下标索引
(integer) 0
2. Python和redis的交互
2.1 基本思路
第一步:安装redis,pip install redis
;
第二步:链接redis数据库、地址、端口号;
第三步:实现逻辑。
关键在于如何去把值(数据)添加到数据库中,数据库中的值如何取出来。
2.2 示例代码
import redis
class InteractWithRedis():
def __init__(self):
self.r = redis.StrictRedis(host='127.0.0.1', port=6379, decode_responses=True)
# 设置字符串值
def str_set(self, k, v):
self.r.set(k, v)
# 取字符串值
def str_get(self, k):
return self.r.get(k)
# 设置字符串多个值
def str_mset(self, dict_data):
self.r.mset(dict_data)
# 取字符串多个值
def str_mget(self, keys):
return self.r.mget(keys)
# 列表左边插值
def list_lpush(self, li_name, values):
for value in values:
self.r.lpush(li_name, value)
# 列表右边插值
def list_rpush(self, li_name, values):
for value in values:
self.r.rpush(li_name, value)
# 列表左边弹出值
def list_lpop(self, li_name):
self.r.lpop(li_name)
# 列表右边弹出值
def list_rpop(self, li_name):
self.r.rpop(li_name)
# 列表范围取值
def list_lrange(self, li_name, start, end):
return self.r.lrange(li_name, start, end)
# 集合添加数据
def set_sadd(self, set_name, values):
for value in values:
self.r.sadd(set_name, value)
# 判断集合中是否存在值
def set_sismeber(self, set_name, value):
return self.r.sismember(set_name, value)
# 集合随机删除数据
def set_pop(self, set_name):
return self.r.spop(set_name)
# 返回集合元素
def set_smembers(self, set_name):
return self.r.smembers(set_name)
# 哈希添加值
def hash_hset(self, hash_name, dict_datas):
for key, value in dict_datas.items():
self.r.hset(hash_name, key, value)
# 取哈希表的值
def hash_hgetall(self, hash_name):
return self.r.hgetall(hash_name)
# 判断集合中是否存在值
def hash_hexists(self, hash_name, key):
return self.r.hexists(hash_name, key)
if __name__ == '__main__':
s = InteractWithRedis()
# 字符串相关操作
s.str_set('name', 'tom')
print(s.str_get('name'))
s.str_mset({'age': '18', 'gender': 'male'})
print(s.str_mget(['age', 'gender']))
# 列表相关操作
s.list_lpush('li', ['3', '4', '5'])
s.list_rpush('li', ['1', '2'])
s.list_lpop('li')
s.list_rpop('li')
print('li = ', s.list_lrange('li', 0, -1))
# 集合有关操作
s.set_sadd('s1', ['a', 'b', 'c', 'd'])
print('c is in s1: ', s.set_sismeber('s1', 'c'))
print('s1 pop: ', s.set_pop('s1'))
print(s.set_smembers('s1'))
# hash有关操作
s.hash_hset('user', {'id': '123', 'name': 'Jerry'})
print('id is in user: ', s.hash_hexists('user', 'id'))
print(s.hash_hgetall('user'))
运行结果:
tom
['18', 'male']
li = ['4', '3', '4', '3', '4', '3', '4', '3', '4', '3', '1', '1', '1', '1', '1']
c is in s1: True
s1 pop: b
{'c', 'a', 'd'}
id is in user: True
{'id': '123', 'name': 'Jerry'}