这里的一切讨论均基于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")
''

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

# 判断键是否存在
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")
['', '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)
['', ''] In [64]: x.lpop("challenge")
'' In [65]: x.rpop("challenge")
'' In [66]: x.lrange("challenge", 0, 20)
[]

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

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

In [77]: x.lrange("challenge", 0, 20)
['', '', '', '', '', '', '', ''] In [81]: x.lrange("challenge", -20, -1)
['', '', '', '', '', '', '', '']

另外删除方法有点类似于python里面的remove方法,是查找对应的值删除,而不是索引删除这里要注意而且这个查找在列表大了之后效率会很低:

In [101]: x.lrange("challenge", 0, -1)
['', '', '', '', '', '', ''] In [102]: x.lrem("challenge", 4)
1L In [103]: x.lrange("challenge", 0, -1)
['', '', '', '', '', '']

还有一批基于列表索引操作的命令:

In [103]: x.lrange("challenge", 0, -1)
['', '', '', '', '', ''] In [104]: x.lindex("challenge", 1)
'' In [105]: x.lindex("challenge", 2)
''

 In [109]: x.lset("challenge", 1, 22)
  True


In [110]: x.lrange("challenge", 0, -1)
  ['8', '22', '6', '5', '3', '2']

除了这里的索引操作赋值和看对应索引上的值以外,还有几个比较特别一点的操作功能不过也不是太常用 这里介绍一下:

# 只保留这个列表区间里面的值
In [112]: x.ltrim("challenge", 0, 4)
True In [113]: x.lrange("challenge",0, -1)
['', '', '', '', ''] # 列表中插入元素
In [131]: x.lrange("challenge", 0, -1)
['', '', '', '', ''] In [132]: x.linsert("challenge", "before", 22, 3)
6 In [133]: x.lrange("challenge", 0, -1)
['', '', '', '', '', '']

这里要注意linsert方法的第三个参数,是查找第一个符合条件的数值并向他的第二个参数(前面或者后面)插入元素。

Reference:

http://www.cnblogs.com/melonjiang/p/5342505.html  Python操作redis

python对redis的常用操作 上 (对列表、字符串、散列结构操作)的更多相关文章

  1. 【Redis学习之五】Redis数据类型:列表和散列

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...

  2. shiro进行散列算法操作

    shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...

  3. Python:说说字典和散列表,散列冲突的解决原理

    散列表 Python 用散列表来实现 dict.散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组).在一般书中,散列表里的单元通常叫做表元(bucket).在 dict 的散列表当中,每个键 ...

  4. python对redis的常用操作 下 (无序集合,有序集合)

    无序集合: 首先介绍增加,删除和获得所有元素的方法.我将会用第二部分来讨论集合的特殊操作: In [136]: x.sadd("challenge", 1,2,3,4,5,6,7, ...

  5. Python - 基本数据类型及其常用的方法之列表

    列表: 特点:用 [] 括起来,切元素用逗号分隔:列表内的元素可以为任何的数据类型. 列表的基本操作: 1.修改 li = [12, 5, 6, ["Aiden", [2, 4], ...

  6. python之redis

    Redis简单介绍 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构 ...

  7. StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html 上一篇文章的不合理之处,已经有所修改. 今天分 ...

  8. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  9. Redis的常用命令及数据类型

    Redis支持的五种数据类型 字符串 (string) 字符串列表 (list) 散列 (hash) 字符串集合 (set) 有序字符串集合 (sorted-set) key(键) keys * 获取 ...

随机推荐

  1. day16 Python map函数

    num_l=[1,2,10,5,3,7] #lambda x:x+1 # def add_one(x): # return x+1 #lambda x:x+1 # def reduce_one(x): ...

  2. sparse 稀疏函数的用法2

    sparse函数 功能:Create sparse matrix-创建稀疏矩阵 用法1:S=sparse(X)——将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩 ...

  3. Django ORM相关

    1. ORM 外键关联查询和多对多关系正反向查询 Class Classes(): name = CF class Student(): name = CF class = FK(to="C ...

  4. FreeRTOS任务函数

    FreeRTOS的任务函数原型如下:void ATaskFunction(void *pvParameters); void ATaskFunction(*pvParameters){;; //函数可 ...

  5. Selenium:集成测试报告

    参考内容:虫师:<selenium2自动化测试实战——基于python语言> PS:书中的代码,只能做参考,最好还是自己码一码,不一定照搬就全是对的,实践出真知啊,踩了很多坑的说... 随 ...

  6. Android 百度sdk5.0定位

    在开发中可能 会用到诸如“定位出当前所在城市,所在位置的经纬度”等功能.一次性的定位肯能定位不成功,可能经纬度未读出来,也可能是地址信息或者城市信息未读出来.此时就需对定位后拿到的信息做判断,加入没有 ...

  7. 2-微信小程序开发(开发界面说明,按钮点击切换显示内容)

    说一个功能,大家在用微信实现控制设备的时候,是不是都在为绑定设备发愁. 我看了很多厂家的微信控制,大部分都只是可以用微信给设备配网,但是没有做用微信绑定的. 一般做绑定都是用设备的MAC地址. 这里我 ...

  8. Redis详解(六)------ RDB 持久化

     前面我们说过,Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,has ...

  9. NOIP常见模板集合

    Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以cla ...

  10. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十五节--缓存小结与ABP框架项目中 Redis Cache的实现

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 缓存 为什么要用缓存 为什么要用缓存呢,说缓存之前先说使用缓存的优点. 减少寄宿服务器的往返调用(round-tr ...