设为首页 加入收藏

TOP

python对redis的常用操作 上 (对列表、字符串、散列结构操作)(一)
2017-09-30 16:47:05 】 浏览:5329
Tags:python redis 常用 操作 字符串 结构

这里的一切讨论均基于python的redis-py库。

安装使用:

pip install redis

然后去获取一个redis客户端:

redis_conn = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB)

redis有五种基本类型。包括字符串类型散列类型列表类型集合类型有序集合类型。每种不同的类型,reids客户端提供了很多不同的操作方法,下面我将记录下平时最常用的一些基于python的操作。。主要是为了方便查阅,因为很久不用又忘记,每次查阅太慢成本太高这种事情本来坐起来就应该无脑又高效,好开始。

注:以下将我上面得到的客户端redis_conn赋值给x,下面x代表python redis客户端。

 

字符串类型

 
  
 
  

In [15]: x.set("foo", 1)
True

 
  

In [16]: x.get("foo")
'1'

 
  

In [17]: x.set("foo", "today I want to apologize to myself")
True

 
  

In [18]: x.get("foo")
'today I want to apologize to myself'

 

# 因为和python里面的关键字del冲突,所以这里python的客户端redis-py是用了delete替代del作为删除的关键字

In [19]: x.delete("foo")
1

 
  

In [20]: x
Redis<ConnectionPool<Connection<host=devdb,port=6379,db=0>>>

 
  

In [21]: x.get("foo")

字符串的增删改查的方法都非常简单。特别注意的是,当你调用删除delete方法的时候返回的是操作成功了多少个对象。另外还有一个递增key的值的操作,但是我觉得只要不拿redis当数据库使用基本上很难用上但是这里也介绍一下:

In [27]: x.incr("num")
1

In [28]: x.incr("num")
2

In [29]: x.incr("num")
3

In [30]: x.incr("num")
4

当key num还没有被set的时候直接使用incr函数可以直接将其置为1,然后再调用会依次递增,而且这个操作是原子操作所以不会出现竞态条件。一般可以用来记录一下访问次数打点什么的,速度也比往数据库直接插来得要快。当然字符串还涉及到一套二进制的操作方法,包括get\set方法等,由于不常用所以这里就不记录了,有兴趣可以自己去查一下。

 

散列类型:

首先直接展示最简单的,设置一个car键的字典为{"price": 400} 然后使用hget方法去得到这个键下面对应的字段的值。

In [44]: x.hset("car", "price", 400)
1L

In [45]: x.hget("car", "price")
'400'

 

下面要展示判断键和键值是否存在:

# 判断键是否存在
In [47]: x.exists("car")
True

In [48]: x.exists("m")
False

# 判断键值是否存在
In [50]: x.hexists("car", "price")
True

In [51]: x.hexists("car", "name")
False

 

当字段不存在的时候才赋值:

In [52]: x.hsetnx("car", "name", "hahaha")
1L

In [53]: x.hsetnx("car", "name", "hahaha")
0L

In [54]: x.hsetnx("car", "name", "xixiix")
0L

In [56]: x.hget("car", "name")
'hahaha'

可以看到,当键为car的属性name不存在的时候第一个操作成功了,但是第二次执行同样的操作就失败了。这是因为hsetnx只是当字段不存在的时候才赋值。成功之后返回被影响的条数。当数据存在的时候,使用hsetnx是无法修改值的。

 

查看某个键下面的全部属性和值可以使用hkeys 和 hval或者使用hlen查看键的属性数量:

In [58]: x.hkeys("car")
['price', 'name']

In [59]: x.hvals("car")
['400', 'hahaha']

 In [60]: x.hlen("car")
  2

 

列表类型:

redis的列表实现使用了一个双端链表,所以redis的列表类型支持从左右两边插入数据。由于是双端链表所以不管从哪边插入或者查询的效率跟列表本身多大是没有关系的。

下面演示插入和弹出和索引数据:

In [61]: x.lpush("challenge", 1)
1L

In [62]: x.rpush("challenge", 2)
2L

In [63]: x.lrange("challenge", 0, 20)
['1', '2']

In [64]: x.lpop("challenge")
'1'

In [65]: x.rpop("challenge")
'2'

In [66]: x.lrange("challenge", 0, 20)
[]

这里展示了插入弹出还有索引数组数据需要使用到的方法,其实还有llen,llen方法可以直接拿到该数组有多少个的存在,而且算法时间复杂度是O(1),因为是常量读取,而并不是传统关系数据库一样的需要去计算。

 

下面单独说说lrange这个命令,也就是操作列表数据读取的命令,除了刚才上面展示的用法,lrange还支持负索引,要是你是python的玩家的话会不会觉得特别亲切?但是这里的负索引并不能逆向列表。下面演示一下:

In [77]: x.lrange("challenge", 0, 20)
['8', '7', '6', '5', '4', '3', '2', '1']

In [81
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇django1.7取消syncdb后不能创建mo.. 下一篇Python array,list,dataframe索引..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目