Redis 模块基本介绍

参考

数据缓存系统:

  • mongodb:直接持久化,直接存储在于硬盘的缓存系统(有疑问)
  • redis:半持久化,存储于内存和硬盘
  • memcache:数据只能存储在内存里的缓存系统

redis

redis是一个key-value存储系统,支持的数据类型:

  • string
  • list
  • zet
  • szet(有序集合)
  • hash(哈希类型)

这些数据类型都支持:push/pop,add/remove及取交集、并集和差集。关键的是,这些操作都是原子性

redis-py 的 API

  • 连接方式和连接池
  • 操作:string操作、hash操作、list操作、set操作、sort set 操作
  • 管道(pipeline)的使用
  • 发布订阅

    redis-py GitHub 链接

连接 redis

连接方式:redis 提供了2个类

  1. StrictRedis:实现了大部分官方的命令
  2. Redis:是 StrictRedis 的子类,用于向后兼容旧版的Redis

普通连接

import redis

redis_config = {
"host": "192.168.189.100",
"port": 6379
}
# redis连接对象
redis_conn = redis.Redis(**redis_config) redis_conn.set("name","ping")
print redis_conn.get("name")

连接池

管理对一个 redis server 的所有连接,避免每次建立,释放连接的开销。默认,每个redis实例后悔维护一个自己的连接池,可以直接建立一个连接池,作为参数传给redis,这样可以实现多个redis实例共享一个连接池。

import redis

redis_config = {
"host": "192.168.189.100",
"port": 6379
} redis_pool = redis.ConnectPool(**redis_config)
r = redis.Redis(connection_pool=redis_pool)
r.set('name','qiang')
print r.get('name')

redis 字符串操作

redis中的String在在内存中按照一个name对应一个value来存储

set() 参数:

set(name, value, ex=None, px=None, nx=False, xx=False)

ex,过期时间(秒)

px,过期时间(毫秒)

nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)

xx,如果设置为True,则只有name存在时,当前set操作才执行

单次设置key-value

import redis

redis_config = {
"host": "192.168.189.100",
"port": 6379
} # 新建一个连接池
redis_pool = redis.ConnectionPool(**redis_config)
# 新建一个 Redis 连接对象
r = redis.Redis(connection_pool=redis_pool)
# 在 Redis 中设置值,若不存在则新建,存在则替换
r.set("name","ping") print r.get("name")

批量设置key-value

import redis

redis_config = {
"host": "192.168.189.100",
"port": 6379
} # 新建一个连接池
redis_pool = redis.ConnectionPool(**redis_config)
# 新建一个 Redis 连接对象
r = redis.Redis(connection_pool=redis_pool)
# 在 Redis 中设置值,若不存在则新建,存在则替换 k_v_pair = {
"alpha": "a",
"bete": "b",
"gamma": "c"
}
# 批量设置值
r.mset(**k_v_pair) # 批量取值
print r.mget("alpha", "bete", "gamma")

redis list操作

redis中的List在内存中按照一个name对应一个list来存储

lpush(name,values)

#在 name 对应的list中添加元素,每个新的元素都添加到列表的最左边
r.lpush("list1","alpha")
r.lpush("list1",3,4,5)
# 查看列表结果
print r.lrange("list1",0,-1)
# 结果
['5', '4', '3', 'alpha']

rpush(name,values)

# 同lpush,但每个新的元素都添加到列表的最右边

lpushx(name,value)

# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边,否则为空

rpushx(name,value)

# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边,否则为空

llen(name)

# name 对应的list元素的个数
print r.llen("list1")

linsert(name,where,refvalue,value)

参数对应:

name: redis的name

where: BEFORE(前)或AFTER(后)

refvalue: 列表内的值

value: 要插入的数据

# 在name对应的列表的某一个值前或后插入一个新值
r.linsert("list1","BEFORE","alpha","bete") #在列表内找到第一个元素alpha,在其之前插入 beta

lset(name,index,value)

# 对list中的某一个索引位置重新赋值,替换掉以前的元素
r.lset("list1",0,"beta")

r.lrem(name,value,num)

参数对应:

name: redis的name

value: 要删除的值

num: num=0 删除列表中所有的指定值;

num=2 从前到后,删除2个;

num=-2 从后向前,删除2个

# 删除name对应的list中的指定值
r.lrem("list1","beta",num=1)

r.lpop(name)

# 移除列表的左侧第一个元素,并返回,相当于出桟
print r.lpop("list1")

r.lindex(name,index)

# 根据索引获取列表内元素
print r.lindex("list1",1)

lrange(name,start,end)

# 分片获取元素,如获取整个list
print r.lrange("list1",0,-1)

ltrim(name,start,end)

# 移除列表内没有在该索引之内的值
r.ltrim("list1",0,2)

rpoplpush(src,dst)

# 从一个列表取出最右边的元素,同时将其添加到另一个列表的最左边
# src 要取数据的列表
# dst 要添加数据的列表

brpoplpush(src,dst,timeout=0)

# 同rpoplpush,多了timeout
# timeout:取数据的列表没元素后的阻塞时间,0为一直阻塞
r.brpoplpush("list1","list2",timeout=0)

blpop(keys,timeout)

# 将多个列表排序,按照从左到右去移除各个列表内的元素
r.lpush("list1",3,4,5)
r.lpush("list2",3,4,5) while True:
print r.blpop(["list1","list2"],timeout=0)
print r.lrange("list1",0,-1),r.lrange("name",0,-1) #结果如下:
('list1', '5')
['4', '3'] ['5', '4', '3']
('list1', '4')
['3'] ['5', '4', '3']
('list1', '3')
[] ['5', '4', '3']
('list2', '5')
[] ['4', '3']
('list2', '4')
[] ['3']
('list2', '3')
[] []

brpop(keys,timeout)

# 同 blpop,将多个列表排序,按照从右往左移除各个列表内的元素

redis set操作

set集合就是不重复的列表

sadd(name,values)

# 给name对应的集合中添加元素
r.sadd("set1","aa")
r.sadd("set2","aa",1,2,"bb")

smembers(name)

# 获取name对应的集合的所有成员

scard(name)

# 获取name对应的集合中的元素个数
r.scard("set1")

有序集合

在集合的基础上,为每个元素排序,元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用开做排序。

zadd(name,*args,**kwargs)

# 在name对应的有序集合中添加元素
r.zadd("set1","a",1,"b",2,"c",3)
# 或者
r.zadd("set1",b1=10,b2=5)

zcard(name)

# 获取有序集合内元素的数量

zcount(name,min,max)

# 获取有序集合中分数在[min,max]之间的个数
print r.zcount("set1",1,5)

Redis Hash操作

hashRedis2.0后增加的一种数据类型,类似大多数编程语言中的map数据结构一样,Redis是键值对的集合,也就是说它存放的是字符串和字符串之间的映射。由于这个特性,hash特别适用于存储一个对象。讲一个对象存储在hash中会占用更少的内存,并且可以方便的存取整个对象。

hset命令

hset 命令用来就爱那个某个hash指定键的值,如果间不存在,则创建并设置对应的值,返回一个整数1,如果键已经存在,则对应的值将被覆盖并返回整数0.具体格式为:

hset hash_name field value

#示例:

127.0.0.1:6379> hset myhash name fred
(integer) 1
127.0.0.1:6379> hset myhash name fred2
(integer) 0

** hmset 命令**

hmset命令和hset命令的作用相似,可以用来设置hash的键和值。不同的是hmset可以同时设置多个键值对,操作成功后hmset命令返回一个简单的字符串'ok'.具体格式如下:

hmset hash_name field1 value1 field2 value2...

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hget myhash name
"fred"
127.0.0.1:6379> hget myhash age
"24"

hsetnx 命令

hsetnx 命令也用来在指定键不存在的情况下设置键值信息。如果键不存在,则Redis会先创建键,然后设置对应的值,操作成功后返回整数1。如果该键已经存在,则该命令不进行任何操作,返回值为0.具体格式如下:

hsetnx hash_name field value

#示例
127.0.0.1:6379> hsetnx myhsh address hangzhou
(integer) 1
127.0.0.1:6379> hsetnx myhsh address guangzhou
(integer) 0
127.0.0.1:6379> hget myhsh address
"hangzhou"

hget命令

hget 命令用开获取某个hash指定key的值。如果该键存在,直接返回对应的值,否则返回nil。具体格式如下:

hget hash_name field

#示例
127.0.0.1:6379> hset myhash name fred
(integer) 0
127.0.0.1:6379> hget myhash name
"fred"
127.0.0.1:6379> hget myhash nonkey
(nil)

hmget命令

hmget命令和hget命令类似,用来返回某个hash多个键的值的列表,对于不存在的键,返回nil值。具体格式如下:

hmget hash_name field1 field2...

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hmget myhash name age weight
1) "fred"
2) "24"
3) (nil)

hexists命令

hexists命令令用来判断某个hash指定键是否存在,若存在返回整数1,否则返回0。具体格式如下:

hexists hash_name field

#示例
127.0.0.1:6379> hset myhash name fred
(integer) 0
127.0.0.1:6379> hexists myhash name
(integer) 1
127.0.0.1:6379> hexists myhash home
(integer) 0

hlen命令

hlen命令用来返回某个hash中所有键的数量。具体格式如下:

hlen hash_name

#示例:
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hlen nonhash
(integer) 0

hdel命令

hdel命令用来删除某个hash指定的键,如果该键不存在,则不进行任何操作。hdel命令的返回值是成功删除的键的数量(不包括不存在的键)。具体格式为:

hdel hash_name field:

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hdel myhash name age
(integer) 2
127.0.0.1:6379> hmget myhash name age
1) (nil)
2) (nil)

hgetall命令

hgetall命令返回一个列表,该列表包含了某个hash的所有键和值。在返回值中,先是键,接下来的一个元素是对应的值,所以hgetall命令返回的列表长度是hash大小的两倍。具体格式如下:

hgetall hash_name

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hgetall myhash
1) "name"
2) "fred"
3) "age"
4) "24"

其他操作

在redis客户端中执行

# 根据name删除redis中的任意数据类型
delete(*name) # 检测redis的name是否存在
exists(name) # 根据 *?等通配符匹配获取redis的name
keys(pattern='*') # 为某个name设置超时时间
expire(name,time) # 重命名
rename(src,dst) # 将redis的某个值移动到指定的db下
move(name,db) # 随机获取一个redis的name(不删除)
randomkey() # 获取name对应值的类型
type(name)

python 操作 Redis的更多相关文章

  1. Python—操作redis

    Python操作redis 连接方式:点击 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建, ...

  2. python——操作Redis

    在使用django的websocket的时候,发现web请求和其他当前的django进程的内存是不共享的,猜测django的机制可能是每来一个web请求,就开启一个进程去与web进行交互,一次来达到利 ...

  3. Python操作Redis、Memcache、RabbitMQ、SQLAlchemy

    Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...

  4. Python操作redis系列之 列表(list) (四)

    # -*- coding: utf- -*- import redis r =redis.Redis(host=,password="ZBHRwlb1608") 1. Lpush ...

  5. 数据库之redis篇(3)—— Python操作redis

    虽然前面两篇已经说了redis的一些配置安装什么的,篇幅有点长,可能看完了也不知道怎么操作,这里再浓缩一下: 什么是redis redis完全开源免费的,遵守BSD协议,是一个高性能的非关系型key- ...

  6. python操作redis命令

    Python操作redis from redis import StrictRedis, ConnectionPoolredis_url="redis://:xxxx@112.27.10.1 ...

  7. Python操作Redis及连接方式

    前沿:随着互联网的高速发展,数据变得越来越重要,Python成为了人工智能的热门语言,而Nosql数据库已成为日常开发用品. 今天要写的是Python操作Redis Redis的安装我就不介绍了,你可 ...

  8. python操作Redis安装、支持存储类型、普通连接、连接池

    一.python操作redis安装和支持存储类型 安装redis模块 pip3 install redis 二.Python操作Redis之普通连接 redis-py提供两个类Redis和Strict ...

  9. python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作

    python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...

  10. python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用

    python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/r ...

随机推荐

  1. [转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此

    AMD.英特尔为何争相走向胶水多核处理器?真相在此 胶水多核到底好不好?这个事不是简单一句话能说明的,今天的超能课堂里我们就来聊聊MCM胶水多核技术的过去及未来. 作者:孟宪瑞来源:超能网|2018- ...

  2. [转帖]HTTPS的简单说明

    HTTPS(全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTT ...

  3. uva 1513(线段树)

    题目链接:1513 - Movie collection 题意:有一堆电影,按1-n顺序排,有m次操作,每次询问第ai个电影之前有多少个电影,然后将其抽出放在堆顶. 分析:线段树应用. 因为每次查询后 ...

  4. ArrayList底层实现

    ArrayList 底层是有数组实现,实际上存放的是对象的引用,而不是对象本身.当使用不带参的构造方法生成ArrayList对象时,实际会在底层生成一个长度为10的数组 当添加元素超过10的时候,会进 ...

  5. BZOJ2186 SDOI2008沙拉公主的困惑(数论)

    由于n!是m!的倍数,而对于每个与m!互质且小于m!的数x,x+m!.x+2*m!……也与其互质,所以答案即为(n!/m!)*φ(m!). φ(m!)=m!*∏(1-1/pi).其中的pi即为1~m中 ...

  6. BZOJ3083 遥远的国度(树链剖分+线段树)

    考虑暴力树剖.那么修改路径和查询子树最小值非常简单. 对于换根当然不能真的给他转一下,我们只记录当前根是哪个.对于查询,如果查询点不在当前根到原根的路径上,显然换根是对答案没有影响的:如果是当前根,答 ...

  7. MT【135】条件线性化

    已知\(x,y>0,\dfrac{1}{x}+\dfrac{2}{y}=1\),求\(\dfrac{1}{x+1}+\dfrac{2}{y+1}\)的最大值_____ 解答:令\(a=\dfra ...

  8. png?wxfrom=5&wx_lazy=1

    作为一名游戏行业的视频&平面设计师,平时的工作就是为公司发行的游戏制作宣传视频.广告.平面宣传图,打交道最多的自然就是Adobe家族的设计软件,Photoshop.AfterEffects.P ...

  9. HDFS问题集(一),使用命令报错:com.google.protobuf.ServiceException:java.lang.OutOfMemoryError:java heap space

    仅个人实践所得,若有不正确的地方,欢迎交流! 一.起因 执行以下两条基本的HDFS命令时报错 hdfs dfs -get /home/mr/data/* ./ hdfs dfs -ls /home/m ...

  10. android.database.CursorIndexOutOfBoundsException:Index -1 requested, with a size of 1(zz)

    android.database.CursorIndexOutOfBoundsException:Index -1 requested, with a size of 1 http://blog.cs ...