Redis简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
从2010年3月15日起,Redis的开发工作由VMware主持
Redis是一个开源(BSD许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件
Redis是一个高性能的key-value存储系统
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便Redis支持主从同步
数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助
参阅:
- Redis官网命令参考
- Redis中文官网命令参考
一、安装Redis
默认端口6379
- yum安装最新版redis
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum --enablerepo=remi install redis -y
提醒:
yum直接安装的redis不是最新版
yum install redis -y
(非最新版)redis软件源
最新软件源 地址 官网 http://rpms.remirepo.net/ CentOS http://rpms.remirepo.net/enterprise/
参阅:
- centos7 yum install redis
- 利用yum安装与使用Redis的方法详解_Redis
- yum的--enablerepo选项是否仅启用当前命令的仓库?
- 查看redis版本
redis-cli -v
- 检查redis安装相关的文件
rpm -qa |grep redis
rpm -ql redis
- redis服务管理
管理 | 命令1 | 命令2 |
---|---|---|
开启 | service redis start |
systemctl start redis |
关闭 | service redis stop |
systemctl stop redis |
重启 | service redis restart |
systemctl restart redis |
查看 | service redis status |
systemctl status redis |
- 配置redis
开机自启动
chkconfig redis on
或
systemctl enable redis.service
redis配置文件
查看配置
cat /etc/redis.conf | grep -vE '#|^$'
修改配置
vim /etc/redis.conf
(1) 开启远程登录
提示:
- 注释或更改ip
(2) 开启守护进程
如果以守护进程运行,则不会在命令行阻塞,类似于服务
如果以非守护进程运行,则当前终端被阻塞
设置为yes表示守护进程,设置为no表示非守护进程
推荐设置为yes
提示:
- 如果以守护进程运行,则不会在命令行阻塞,类似于服务
- 如果以非守护进程运行,则不会阻塞当前终端
- 设置为yes表示守护进程,设置为no表示非守护进程
- 推荐设置为
yes
(3) 关闭保护模式
提醒:
- 生产环境中应该更换端口,避免黑客攻击
参阅:
- Redis daemonize介绍
- 连接redis
redis-cli
二、使用Redis
1.1 客户端与服务端
Redis | 服务端 | 客户端 |
---|---|---|
命令 | redis-server |
redis-cli |
帮助文档 | redis-server --help |
redis-cli --help |
其他 | 切换数据库 select 1 运行测试 ping |
提示:
- 数据库没有名称,默认有16个,通过0-15来标识
1.2 数据操作
- redis是key-value的数据结构,每条数据都是一个键值对
- 键的类型是字符串
- 键不能重复
值的类型分为五种:
➢ 字符串 string
➢ 哈希 hash
➢ 列表 list
➢ 集合 set
➢ 有序集合 zset
1.2.1 字符串 string
- string是redis最基本的类型
- 最大能存储512MB数据
- string类型是二进制安全的,可以存储任何数据,比如数字、图片等
数据操作 | 说明 |
---|---|
增 | 如果设置的键不存在则为添加,如果设置的键已经存在则修改 (1) 设置键值 格式: set key value eg: 设置键为'py1'值为'gj'的数据 set py1 gj (2) 设置键值及过期时间,以秒为单位 格式: setex key seconds value eg: 设置键为'py2'值为'hr'过期时间为3秒的数据 setex py2 3 hr (3) 设置多个键值 格式: mset key1 value1 key2 value2 ... eg: 设置键为'py3'值为'dx'、键为'py4'值为'xd'、键为'py5'值为'nd'、键为'py6'值为'bg'的数据 mset py3 dx py4 xd py5 nd py6 bg |
删 | 见下节键的操作,删除键时会将值删除 |
改 | (1)追加值 格式: append key value eg: 向键为py1中追加值'haha' append py1 haha |
查 | (1)获取:根据键获取值,如果不存在此键则返回nil 格式: get key eg: 获取键'py1'的值 get py1 (2) 根据多个键获取多个值 格式: mget key1 key2 ... eg: 获取键'py3'、'py4'、'py5'、'py6'的值 mget py3 py4 py5 py6 |
1.2.2 键命令
数据操作 | 说明 |
---|---|
增 | |
删 | (1) 删除键及对应的值 格式: del key1 key2 ... eg: 删除键'py3'、'py4'、'py5'、'py6' del py3 py4 py5 py6 |
改 | (1) 设置过期时间,以秒为单位 如果没有指定过期时间则一直存在,直到使用DEL移除 格式: expire key seconds eg: 设置键'py1'的过期时间为10秒 expire py1 10 |
查 | 查找键,参数通配符查找 格式: keys pattern (1) 查看所有键 格式: keys * eg: 查看名称中包含1的键 keys *1* (2) 判断键是否存在,如果存在返回1,不存在返回0 格式: exists key1 eg: 判断键'py1'、'py2'是否存在 exists py1 exists py2 (3) 查看键对应的value的类型 格式: type key eg: 查看键'py1'的值类型,为redis支持的五种类型中的一种 type py1 (4) 查看有效时间,以秒为单位 格式: ttl key eg: 查看键'py2'的有效时间 ttl py2 |
- 删除所有key
删除当前数据库中的所有Key
flushdb
删除所有数据库中的Key
flushall
参阅:
- 批量删除Key
1.2.3 哈希 hash
- hash用于存储对象,对象的结构为属性、值
- 值的类型为string
数据操作 | 说明 |
---|---|
增 | |
删 | (1) 删除整个hash键及值,使用del命令 格式: hdel key field1 field2 ... eg: 删除键'py3'的属性'gender'、'birthday' hdel py3 gender birthday |
改 | (1) 设置单个属性 格式: hset key field value eg: 设置键'py2'的属性'name'为'hr' hset py2 name hr (2) 设置多个属性 格式: hmset key field1 value1 field2 value2 ... eg: 设置键'py3'的属性'name'为'dx'、属性'gender'为'1'、属性'birthday'为'2017-1-1' hmset py3 name dx gender 1 birthday 2017-1-1 |
查 | (1) 获取指定键所有的属性 格式: hkeys key eg: 获取键'py3'的所有属性 hkeys py3 (2) 获取一个属性的值 格式: hget key field eg: 获取键'py2'属性'name'的值 hget py2 name (3) 获取多个属性的值 格式: hmget key field1 field2 ... eg: 获取键'py3'属性'name'、'gender'、'birthday'的值 hmget py3 name gender birthday (4) 获取所有属性的值 格式: hvals key eg: 获取键'py3'所有属性的值 hvals py3 |
1.2.4 列表 list
- 列表的元素类型为string
- 按照插入顺序排序
数据操作 | 说明 |
---|---|
增 | (1) 在左侧插入数据 格式: lpush key value1 value2 ... eg: 从键为'py11'的列表左侧加入数据'dx'、'xd' lpush py11 dx xd (2) 在右侧插入数据 格式: rpush key value1 value2 ... eg: 从键为'py11'的列表右侧加入数据'nd'、'bg' rpush py11 nd bg (3) 在指定元素的前或后插入新元素 格式: linsert key before|after [现有元素] [新元素] eg: 在键为'py11'的列表中元素'nd'前加入'zbt' linsert py11 before nd zbt |
删 | (1) 删除指定元素 ➢ 将列表中前count次出现的值为value的元素移除 ➢ count > 0: 从头往尾移除 ➢ count < 0: 从尾往头移除 ➢ count = 0: 移除所有 格式: lrem key count value eg: 向列表'py12'中加入元素'h0'、'h1'、'h2'、'h0'、'h1'、'h3'、'h0'、'h1' rpush py12 h0 h1 h2 h0 h1 h3 h0 h1 从'py12'列表右侧开始删除2个'h0' lrem py12 -2 h0 查看列表'py12'的所有元素 lrange py12 0 -1 |
改 | (1) 设置指定索引位置的元素值 ➢ 索引从左侧开始,第一个元素为0 ➢ 索引可以是负数,表示尾部开始计数,如-1表示最后一个元素 格式: lset key index value eg: 修改键为'py11'的列表中下标为1的元素值为'xidu' lset py11 1 xidu |
查 | (1) 返回列表里指定范围内的元素 ➢ start、stop为元素的下标索引 ➢ 索引从左侧开始,第一个元素为0 ➢ 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素 格式: lrange key start stop eg: 获取键为'py11'的列表所有元素 lrange py11 0 -1 |
1.2.5 集合 set
- 无序集合
- 元素为string类型
- 元素具有唯一性,不重复
- 对于集合没有修改操作
数据操作 | 说明 |
---|---|
增 | (1) 添加元素 格式: sadd key member1 member2 ... eg: 向键'py21'的集合中添加元素'yg'、'xln'、'yzp' sadd py21 yg xln yzp |
删 | (1) 删除指定元素 格式: srem key member eg: 删除键'py21'的集合中元素'yzp' srem py21 yzp |
改 | —— |
查 | (1) 返回所有的元素 格式: smembers key eg: 获取键'py21'的集合中所有元素 smembers py21 |
1.2.6 有序集合 zset
- sorted set,有序集合
- 元素为string类型
- 元素具有唯一性,不重复
- 每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
- 没有修改操作
数据操作 | 说明 |
---|---|
增 | (1) 添加 格式: zadd key score1 member1 score2 member2 ... eg: 向键'py31'的集合中添加元素'gj'、'hr'、'yg'、'xln',权重分别为1、5、8、3 zadd py31 1 gj 5 hr 8 yg 3 xln |
删 | (1) 删除指定元素 格式: zrem key member1 member2 ... eg: 删除集合'py31'中元素'yg' zrem py31 yg (2) 删除权重在指定范围的元素 格式: zremrangebyscore key min max eg: 删除集合'py31'中权限在4、9之间的元素 zremrangebyscore py31 4 9 |
改 | —— |
查 | (1) 返回指定范围内的元素 ➢ start、stop为元素的下标索引 ➢ 索引从左侧开始,第一个元素为0 ➢ 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素 格式: zrange key start stop eg: 获取键'py31'的集合中所有元素 zrange py31 0 -1 (2) 返回score值在min和max之间的成员 格式: zrangebyscore key min max eg: 获取键'py31'的集合中权限值在4和9之间的成员 zrangebyscore py31 4 9 (3) 返回成员member的score值 格式: zscore key member eg: 获取键'py31'的集合中元素'yg'的权重 zscore py31 yg |
提示:
- 高级类型向下存储为基本类型没有错误
- 基本类型向上存储为高级类型就会失败
- 不同高级类型之间使用相同的key值存储数据会失败
- hash(高级类型)=(key值)=>string(基本类型) 成功
eg:
flushdb
hset stu1 name yy
set stu1 yy
- string(基本类型)=(key值)=>hash(高级类型) 失败
eg:
flushdb
set stu1 yy
hset stu1 name yy
- hash(高级类型)=(key值)=>list(高级类型) 失败
eg:
flushdb
hset stu1 name yy
lpush stu1 A B C
1.3 与Python交互
1.3.1 安装redis库
yum install pip-python
pip install redis
1.3.2 调用模块
- 引入模块
from redis import *
这个模块中提供了StrictRedis对象,用于连接redis服务器,并按照不同类型提供了不同方法,进行交互操作
1.3.4 方法
StrictRedis对象方法
- 通过init创建对象,指定参数host、port与指定的服务器和端口连接,host默认为localhost,port默认为6379
- 根据不同的类型,拥有不同的实例方法可以调用,与前面学的redis命令对应,方法需要的参数与命令的参数一致
1. string
- set
- setex
- mset
- append
- get
- mget
- key
- keys
- exists
- type
- delete
- expire
- getrange
- ttl
2. hash
- hset
- hmset
- hkeys
- hget
- hmget
- hvals
- hdel
3. list
- lpush
- rpush
- linsert
- lrange
- lset
- lrem
4. set
- sadd
- smembers
- srem
5. zset
- zadd
- zrange
- zrangebyscore
- zscore
- zrem
- zremrangebyscore
1.3.4 String
1. 增
增加
- 方法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
- 创建文件redis_add.py,编写代码如下
#coding=utf-8
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建立连接
sr=StrictRedis()
#添加键py1,值为gj
result=sr.set('py1','gj')
#输出响应结果,如果添加成功则返回True,否则返回False
print result
except Exception as e:
print e
2. 删
删除
- 方法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返回0
- 创建文件redis_delete.py,编写代码如下
#coding=utf-8
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建立连接
sr=StrictRedis()
#设置键py1的值,如果键已经存在则进行修改,如果键不存在则进行添加
result = sr.delete('py1')
#输出响应结果,如果删除成功则返回受影响的键数,否则则返回0
print result
except Exception as e:
print e
3. 改
修改
- 方法set,如果键已经存在则进行修改,如果键不存在则进行添加
- 创建文件redis_set.py,编写代码如下
#coding=utf-8
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建立连接
sr=StrictRedis()
#设置键py1的值,如果键已经存在则进行修改,如果键不存在则进行添加
result = sr.set('py1','hr')
#输出响应结果,如果操作成功则返回True,否则返回False
print result
except Exception as e:
print e
4. 查
获取
- 方法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
- 创建文件redis_get.py,编写代码如下
#coding=utf-8
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建立连接
sr=StrictRedis()
#获取键py1的值
result = sr.get('py1')
#输出键的值,如果键不存在则返回None
print result
except Exception as e:
print e
5. 获取键
- 方法keys,根据正则表达式获取键
- 创建文件redis_keys.py,编写代码如下
#coding=utf-8
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建立连接
sr=StrictRedis()
#获取所有的键
result=sr.keys()
#输出响应结果,所有的键构成一个列表,如果没有键则返回空列表
print result
except Exception as e:
print e
参阅:
- 牛壮壮redis笔记
更新中......