众所皆知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 redisredisdb = redis.StrictRedis()class redislist:def __init__(self, rediskey):self.rediskey = rediskeydef 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