众所皆知Redis的增删改查指令十分简陋,我们如何在Python中像操作自身的list一样操作redis的list呢?
比如切片赋值:
a = [1,2,3,4]
b = [6,7,8,9]
a[:3:2] = b[:3:2]
print(a)
下面开始准备工作
在redis中这么一个list,key为testlist2
127.0.0.1:6379> lrange testlist2 0 5
1) "feng"
2) "5"
3) "wei"
4) "tu"
5) "test"
import redis
redisdb = redis.StrictRedis()
class redislist:
def __init__(self, rediskey):
self.rediskey = rediskey
def append(self, item):
redisdb.rpush(self.rediskey, item)
def pop(self):
return redisdb.rpop(self.rediskey).decode("utf8")
def clear(self):
redisdb.delete(self.rediskey)
def __len__(self):
return redisdb.llen(self.rediskey)
def __getitem__(self, index):
if isinstance(index, int):
if index >= self.__len__():
raise StopIteration()
return redisdb.lindex(self.rediskey, index).decode("utf8")
elif isinstance(index, slice):
return list(map(lambda x: x.decode("utf8"), redisdb.lrange(self.rediskey, 0, self.__len__())[index] ))
def __setitem__(self, index, value):
if isinstance(index, int):
if index >= self.__len__():
raise Exception("over range list")
redisdb.lset(self.rediskey, index, value)
elif isinstance(index, slice):
for i, j in enumerate(range(0, self.__len__())[index]):
redisdb.lset(self.rediskey, j, value[i])
def __str__(self):
return str(self.__getitem__(slice(None, None, None)))
m = redislist("testlist2")
print(m)
for i in m:
print(i)
print(tuple(m))
m[::2] = [1,1,1]
print(m)
输出:
['feng', '5', 'wei', 'tu', 'test']
feng
5
wei
tu
test
('feng', '5', 'wei', 'tu', 'test')
['1', '5', '1', 'tu', '1']
查看Redis ,可见切片赋值走通了
127.0.0.1:6379> lrange testlist2 0 5
1) "1"
2) "5"
3) "1"
4) "tu"
5) "1"
备注:
由于Redis只支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set:有序集合),因此 int 和 float 等数字类型存入Redis时会被转成 string