cache存在redis中在内存中提高访问速度
选择数据库:select 数据库号 redis端口,默认为6379
redis概述
1、Redis:REmote DIctionary Server(远程字典服务器)
2、redis是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器
)Redis 与其他 key - value 缓存产品有以下三个特点:
3.1)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
3.2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
3.3)Redis支持数据的备份,即master-slave模式的数据备份
守护进程
• 是否以守护进程运行(可以在后台运行)
o 如果以守护进程运行,则不会在命令行阻塞,类似于服务
o 如果以非守护进程运行,则当前终端被阻塞,无法使用
o 推荐改为yes,以守护进程运行
在 Ubuntu 系统安装 Redis 可以使用以下命令:sudo apt-get update
sudo apt-get install redis-server
启动redis服务 推荐指定配置文件启动sudo redis-server /etc/redis/redis.conf
或者 sudo service redis start 使用 redis 客户端查看是否启动redis-cli
停止redis服务:sudo kill -9 redis的进程id或者sudo service redis stop
重启redis服务:sudo service redis restart 按ctrl+c停止
启动客户端:在新终端中运行如下代码redis-cli运行命令ping set 'a' '123'
当添加键值后,发现在当前运行的目录下,创建了一个文件:dump.rdb,这个文件用于将数据持久化存储 测试服务是否可用ping
查询服务端redis-server --version或者redis-server -v
查询客户端redis-cli --version 或者 redis-cli -v
打开配置文件命令:sudo subl /etc/redis/redis.conf
查看redis当前状态ps ajx|grep redis
数据操作
redis是key-value的数据,所以每个数据都是一个键值对键的类型是字符串
值的类型分为五种:字符串string哈希hash列表list集合set有序集合zset
1. string
• string是redis最基本的类型
• 最大能存储512MB数据
• string类型是二进制安全的,即可以为任何数据,比如数字、图片、序列化对象
设置键值存数据set key value
设置键值及过期时间,以秒为单位setex seconds key value
设置多个键值注意,key和值不加引号也可以mset 'key1' 'hello' 'key2' 'world'
根据键获取值,如果不存在此键则返回nil,系统键不区分大小写 get key
根据多个键获取多个值 mget 'key1' 'key2'
运算 将key对应的value加1 incr key
将key对应的value加整数 incrby key 数值 #(integer) 5 5为值
将key对应的value减1 decr key
将key对应的value减整数 decrby key 数值
追加值在后面追加字符串 append key value #(integer) 5 5为字符串长度
获取值长度 strlen key
查找键,参数支持正则 keys 条件 *为所有键
判断键是否存在,如果存在返回1,不存在返回0 exists key [key ...]
查看键对应的value的类型 type key
删除键及对应的值,删除成功返回1,失败返回0 del key [key ...]
创建时没有设置过期时间则一直存在,直到使用使用DEL移除expire key seconds
查看有效时间,以秒为单位TTL key
2、hash
hash 用于存储对象,对象的格式为键值对
hash 特别适合用于存储对象。相对于将对象的每个字段存成单个string 类型。将一个对象。存储在hash 类型中会占用更少的内存,并且可以更方便的存取整个对象
设置单个属性:hset key field value 例子:hset py3 name '郭靖'
设置多个属性:hmset py4 name 'gj' gender '0'
获取一个属性的值:hget key field
获取多个属性的值:hmget key field [field ...]
获取所有属性和值:hgetall key
获取所有的属性hkeys key
获取所有值:hvals key
返回包含属性的个数:hlen key
判断属性是否存在:hexists key field 存在为1不存在为0
删除属性及值:hdel key field [field ...]
3、list(后面的爬虫用到)列表的元素类型为string。按照插入顺序排序
在头部插入数据:lpush key value [value ...] 案例:lpush py5 'abc' 'efg'
在尾部插入数据:rpush key value [value ...] 案例:rpush py5 'hij' 'qlm'
查看类型 type key
在一个元素的前|后插入新元素:linsert key before|after pivot(位置\目标) value
具体案例:linsert py5 after 'abc' '123'
修改指定位置的元素lset key index value
•可以设置指定索引的元素值
•索引是基于0的下标,索引可以是负数,表示偏移量是从list尾部开始计数
获取:返回存储在 key 的列表里指定范围内的元素
lrange key start end 例如:lrange py5 2 -1
• start 和 end 偏移量都是基于0的下标
• 偏移量也可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素
移除并且返回 key 对应的 list 的第一个元素lpop key 例lpop py5
移除并返回 key 对应的 list 的最后一个元素rpop key 案例:rpop py5
裁剪列表改为原集合的一个子集 ltrim key start end 案例:ltrim py5 1 2
• start 和 end 偏移量都是基于0的下标
• 偏移量也可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素 返回存储在 key 里的list的长度:llen key
返回列表里索引对应的元素:lindex key index
4、set无序集合、元素为string类型、元素具有唯一性,不重复
添加元素sadd key member [member ...] 例子:sadd py6 abc 123 defg
获取返回key集合所有的元素:smembers key 例子:集合所有元素smembers py6
返回集合元素个数scard key 例如:查看py6集合元素的个数scard py6
求多个集合的交集sinter key [key ...]
例如:求py6和py7两个集合的交集sinter py6 py7
• 求某集合与其它集合的差集sdiff key [key ...]
例如:从py6中减掉py7中py6也存在的元素:sdiff py6 py7
例如:从py7中减掉py6中py7也存在的元素:sdiff py7 py6
• 求多个集合的合集:sunion key [key ...] 例如:sunion py6 py7
zset sorted set,有序集合。元素为string类型。元素具有唯一性,不重复
每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
元素的score可以相同
添加zadd key score member [score member ...]
返回指定范围内的元素zrange key start stop
返回元素个数:zcard key
返回有序集key中,score(权重)值在min和max之间的成员:zcount key min max
返回有序集key中,成员member的score值:zscore key member
订阅:subscribe 频道名称 [频道名称 ...]
取消订阅Ctrl+c退出也可以取消订阅
• 如果不写参数,表示取消所有订阅:unsubscribe 频道名称 [频道名称 ...]
发布:publish 平道 消息
python连接redis sentinel集群(哨兵模式)
import redis
from redis.sentinel import Sentinel
# 连接哨兵服务器(主机名也可以用域名)
sentinel = Sentinel([('172.31.0.2', 5001),
('172.31.0.3', 5001),
('172.31.0.4', 5001),
('172.31.0.5', 5001)
],socket_timeout=0.5)
# 获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)
# 输出:('172.31.0.2', 5001)
# 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
# 输出:[('172.31.3', 5001), ('172.31.0.4', 5001), ('172.31.0.5', 5001)]
# 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)
w_ret = master.set('foo', 'bar')
# 输出:True
# # 获取从服务器进行读取(默认是round-roubin)
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)
r_ret = slave.get('foo')
print(r_ret)
# # 输出:bar
主从配置
设置主服务器的配置。使用vim或者其他文本工具找到redis.conf配置文件
sudo vim /etc/redis/redis.conf
设置从服务器的配置。使用vim或者其他文本工具找到redis.conf配置文件
sudo vim /etc/redis/redis.conf
在slaveof后面写主机ip,再写端口,而且端口必须写
bind 192.168.1.11
slaveof 192.168.1.10 6379
在主服务器在master和slave分别执行info命令,查看输出信息
进入客户端:redis-cli -h 192.168.1.10
Redis与Python交互
联网命令安装:sudo pip3 install redis
引入模块import redis
连接:red = redis.StrictRedis(host="192.168.31.114",port=6379)