一、Redis介绍

  Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库(非关系型数据库)。

  本质:将数据保存在内存中。

  用途:缓存、消息队列。

1、Redis的特点

  Redis支持五种数据类型:字符串、列表、哈希散列表、集合、有序集合。和Memcached类似,但它支持存储的values类型相对更多。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。

  Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载进行使用。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  Redis支持数据库备份。

2、Redis优势

  Redis性能极高,读的速度是110000次/s,写的速度是8100次/s。

  Redis丰富的数据类型(String、Lists、Hashes、Sets、Ordered Sets)。

  Redis的所有操作都是原子性的,要么成功执行、要么完全失败不执行,多个操作支持事务,即MULTI和EXEC指令包起来。

  Redis有丰富的特性,支持publish/subscribe(发布/订阅者模式),通知,key过期等特性。

3、memcached & redis异同

相同点:都是NoSQl数据库,数据存到内存,读取速度快
好处如下:
1.减少数据库压力,提升访问速度
2.在数据挂掉的情况下,仍能保证业务正常运行一段时间,提升安全性 不同点:
(1)类型
memcached:类型单一,只能存字符串"key为字符串"="value也为字符串"
redis:支持五大类型:string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)、hash(哈希类型)
(2)持久化
memcached:断电数据丢失
redis:支持持久化,单独开一个进程完成持久化,要保持性能就需要关闭持久化,很多公司并不使用持久化功能

4、Redis数据类型

  String字符串:可以包含任何数据,包括图片以及序列化对象,一个键最大能存储512MB。

  List列表:简单的字符串列表,按照插入顺序排序,可以从两段进行添加,类似于双向链表,列表还可以进行阻塞。

  Hash散列表:一个String类型的key和value的映射表,hash特别适合存储对象,类比python字典。

  Set集合:字符串类型的无序且不重复集合。集合是通过哈希表实现,所以添加、删除、查找的时间复杂度都是O(1)。

  Zset有序集合:zset和set一样,不同的是每个元素会关联一个double类型的分数,redis正是通过对分数的排序对集合进行有序存储。

5、Redis安装和启动

(1)Redis安装

$ wget http://download.redis.io/releases/redis-5.0.2.tar.gz
$ tar xzf redis-5.0.2.tar.gz
$ cd redis-5.0.2
$ make # 编译redis程序

(2)Redis启动

  一般启动reids-server都需要结合配置文件来启动。这样在配置文件中的配置就会生效在启动的redis服务中。

$ pwd
/Users/hqs/redis-5.0.2
$ src/redis-server redis.conf # 启动redis服务 # 启动新终端,使用内置的客户端与redis进行交互
$ pwd
/Users/hqs/redis-5.0.2
$ src/redis-cli
127.0.0.1:6379> set name 'bobo'
OK
127.0.0.1:6379> get name
"bobo"

6、Redis配置

  可以通过redis-cli进入交互模式,使用config命令查看或设置配置项。也可以进入配置文件用vim编辑器进行修改。

# 获取所有配置项
reids 127.0.0.1:6379> config get *
# 获取单个配置项
redis 127.0.0.1:6379> config get loglevel
# 编辑配置
redis 127.0.0.1:6379> config set loglevel "notice"

二、python操作Redis

  首先需要下载安装redis模块:pip3 install redis

  Redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令。

  Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

  Redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。

  如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。

  连接redis,加上decode_response=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。

1、Redis模块Redis类源码

class Redis(object):
def __init__(self, host='localhost', port=6379,
db=0, password=None, socket_timeout=None,
socket_connect_timeout=None,
socket_keepalive=None, socket_keepalive_options=None,
connection_pool=None, unix_socket_path=None,
encoding='utf-8', encoding_errors='strict',
charset=None, errors=None,
decode_responses=False, retry_on_timeout=False,
ssl=False, ssl_keyfile=None, ssl_certfile=None,
ssl_cert_reqs='required', ssl_ca_certs=None,
max_connections=None, single_connection_client=False,
health_check_interval=0):

  默认host是'localhost',默认端口是6379。db以数字呈现,默认值是0,配置了16个db,可以通过配置db来切换到对应的数据库,相当于对内存中的大redis进行分块。

  password是数据库密码,socket_timeout是超时时间,socket_connect_timeout是连接超时数。

  connection_pool是连接池,max_connection是最大连接数。

  decode_responses很重要,默认值是False,若改为True,则从redis取出的值都是字符串。

2、Redis连接

import redis

"""
conn = redis.Redis(host='127.0.0.1', port=6379)
# 设置值
conn.set("n1", "v1")
conn.hset("n2", "k2", "v2") ret1 = conn.get('n1')
ret2 = conn.hget('n2', 'k2') print(ret1, ret2) # 输出:b'v1' b'v2'
""" conn = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
# 设置值
conn.set("n1", "v1")
conn.hset("n2", "k2", "v2") ret1 = conn.get('n1')
ret2 = conn.hget('n2', 'k2') print(ret1, ret2) # 输出:v1 v2

  Redis set命令用于在redis中设置值,不存在则创建,存在则修改。

  Redis hset命令用于在哈希表中字段赋值。不存在则创建新的哈希表,已存在于哈希表中旧值被覆盖。

  Redis get 命令用于获取指定 key 的值。返回key的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。

  Redis hget 命令用于返回哈希表中指定字段的值。返回给定字段的值。如果给定字段或key不存在,返回nil。

3、hset与hmset、hget与hgetall命令对比

  Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

import redis

conn = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
conn.hmset("n3", {"k3": "v3", "k4": "v4"}) # 单条单条取
ret3 = conn.hget("n3", "k3")
ret4 = conn.hget("n3", "k4")
print(ret3, ret4) # v3 v4 # 全取
ret5 = conn.hgetall("n3")
print(ret5) # {'k3': 'v3', 'k4': 'v4'}

三、Redis基本命令

  Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令。

  Redis命令大全:http://www.redis.cn/commands.html

四、redis连接池

  redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。

  默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池

import redis

pool = redis.ConnectionPool(host='127.0.0.1', port=6379, decode_responses=True,
max_connections=10) # 最大连接数
conn = redis.Redis(connection_pool=pool)
ret = conn.get("n1")
print(ret) # 输出:v1

  如果想要并发操作,就需要写成单例,以模块导入就是一个单例,把他做成单例,写在一个文件里面,import它就是一个单例。

五、resdis发布订阅者模型

  Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分:发布者、订阅者和Channel。

  发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。

  Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。

  

1、发布者(pub.py)

  redis采用publish命令发送消息,其返回值是接收到该消息的订阅者的数量。

import redis

# 创建连接
conn = redis.Redis(host="127.0.0.1", port=6379, decode_responses=True)
# 创建发布者
conn.publish('hqs', 'Hello world!!')

2、订阅者(sub.py)

  redis采用subscribe命令订阅某频道,返回值包含客户端订阅的频道、目前已订阅的频道数量、接收到的消息(subscribe表示已经成功订阅某频道)。

import redis

# 创建连接
conn = redis.Redis(host="127.0.0.1", port=6379, decode_responses=True) # 第一步:生成一个订阅者对象
pubsub = conn.pubsub()
# 第二步:订阅一个消息(实质就是监听这个键)
pubsub.subscribe('hqs')
# 第三步:死循环一直等待监听结果
while True:
print("working~~~~")
msg = pubsub.parse_response()
print(msg)

3、测试发布订阅者模式

  先执行生成三个订阅者:

  

  再用发布者发布消息,订阅者输出如下:

  

六、更多资料

林海峰redis
redis中文网

Redis与python的更多相关文章

  1. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  2. Redis的Python客户端redis-py的初步使用

    1. Redis的安装 sudo pip install redis sudo pip install hiredis Parser可以控制如何解析redis响应的内容.redis-py包含两个Par ...

  3. redis与python交互

    import redis #连接 r=redis.StrictRedis(host="localhost",port=6379,password="sunck" ...

  4. LinuxMint上安装redis和python遇到的一些问题

    今天在安装Redis和Python上遇到了些问题,解决后记录下来. 环境:LinuxMint 18.3 安装redis sudo wget http://download.redis.io/relea ...

  5. Redis在python中的使用

    一 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  6. redis & macOS & python

    redis & macOS & python how to install python 3 on mac os x? https://docs.python.org/3/using/ ...

  7. Redis的Python客户端redis-py

    1. 安装 1. redis-py a. 使用easy_install 1 sudo easy_install redis  b. 源码安装 1 2 3 git clone https://githu ...

  8. Redis client Python usage

    http://www.yiibai.com/redis/redis_sorted_sets.html mport redis r_server = redis.Redis('localhost') # ...

  9. Redis in python

    什么是Redis 数据库类型分为两种,关系型和非关系型,Redis是一个非常重要的非关系型数据库. 既然是数据库,就是存储数据的一个空间,或者说是一个软件,非关系就是不再按照一对一多对多等结构进行外键 ...

  10. Redis之Python操作

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

随机推荐

  1. 正确使用Spring Data JPA规范

    在优锐课的学习分享中探讨了关于,Spring Data JPA的创建主要是为了通过按方法名称生成查询来轻松创建查询. 但是,有时我们需要创建复杂的查询,而无法利用查询生成器.码了很多知识笔记分享给大家 ...

  2. 打印从1到最大的n

    题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999 需考虑大数问题 #-*-coding:utf-8-*- class print_N: d ...

  3. LeetCode 387: 字符串中的第一个唯一字符 First Unique Character in a String

    题目: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. Given a string, find the first non-repeating charact ...

  4. 给HttpClient添加请求头(HttpClientFactory)

    前言 在微服务的大环境下,会出现这个服务调用这个接口,那个接口的情况.假设出了问题,需要排查的时候,我们要怎么关联不同服务之间的调用情况呢?换句话就是说,这个请求的结果不对,看看是那里出了问题. 最简 ...

  5. Linux 内存释放

    简介 linux 内存释放通过如下命令,将cache与buff根据环境进行释放操作,避免重启释放内存. 操作 1.将内存中buff数据保存磁盘 sync 2.清理cache与buff缓存 echo 3 ...

  6. 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁

    问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...

  7. go-面向对象编程(上)

    一个程序就是一个世界,有很多对象(变量) Golang 语言面向对象编程说明 1) Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对 象语言.所以我们说 ...

  8. PHP+Ajax手机移动端发红包实例

    基本流程:当输入完红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,且每个红包金额不等,并且所有红包金额总额等于总金额. 实现原理:设定总金额为10元,有N个 ...

  9. Linux帮助——重要文件

    Linux帮助——重要文件 摘要:本文主要介绍了Linux系统中常用的文件. 查看系统安装版本 文件 /etc/redhat-release 内容 [root@localhost ~]# cat /e ...

  10. 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)

    场景 SpringCloud -创建统一的依赖管理: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102530574 Sprin ...