Redis 入门

NoSQL

NoSQL是一类新出现的数据库,不支持SQL语法,也不是关系型数据库,而是基于KEY-VALUE方式存储数据。他们没有通用的语言,而是各自有各自的语法和用法。他们往往适用于关系简单,而对事务强的业务有很好的支持。

NoSQL数据库常见的有:

  • Mongodb
  • Redis
  • Hadoop

Redis 简介

官方网站
参考文档

  • 支持数据的持有化
  • 不仅支持key-value,还支持list,set,zset,hash等结构。
  • 支持数据备份
  • 性能极高
  • 拥有丰富的数据类型
  • 操作都是原子性的

Redis常常用来做缓存,其读写效率很高,适用于社交平台等大型系统等。

Redis 安装与配置

安装

配置

打开配置文件redis.conf

bind:绑定的IP
port:绑定的端口
daemonizs:是否为守护进程(改为yes)
dbfilename:数据存储文件名
dir:存储路径
logfile:日志文件
database:数据库数量
slaveof:设置主从(一般不用)

启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 直接运行
sudo redis-server /etc/redis/redis.conf
ps -ef | grep redis # 得到PID号
sudo kill -9 PID号
# 以服务方式运行
sudo service redis start
sudo service redis stop

# 进入redis,默认进入0号数据库
redis-cli

# redis-cli 命令
ping # ping数据库
select 5 # 切换数据库

Redis

数据类型

  • string:字符串,可以接受任意二进制数据,最大可容纳512MB。
  • hash:哈希,用于存储对象,包含属性、值,值的类型为string。
  • list:列表,每个元素都是string,按照插入顺序排序。
  • set:集和(无序),元素具有唯一性,且不可修改。
  • zset:有序集和,元素具有唯一性,且每个元素具有一个权重,并按照权重从小到大排序,也是没有修改操作。

数据操作

基本操作

1
2
3
4
5
6
7
8
9
# 键命令
keys pattern # 支持正则表达式
keys * # 查看所有键
keys 'a*' # 查看所有a开头的键
exists key # 查看是否存在键
type key # 查看类型
del key # 删除键
expire key seconds # 设置过期时间
ttl key # 查看键的剩余时间

字符串操作

1
2
3
4
5
6
7
8
9
# 保存
set key value
setex key seconds value # 设置过期时间
mset key1 value1 key2 value2 # 设置多个键值
append key value # 追加值

# 获取
get key # 如果不存在返回(nil)
mget key1 key2 key3

哈希操作

1
2
3
4
5
6
7
8
9
10
# 设置
hset key field value # 设置单个属性
hmset key field1 value1 field2 value2 # 设置多个值
# 获取
hkeys key # 获取属性
hget key field # 获取值
hmget key field1 field2 # 获取多个值
hvals key # 获取所有值
# 删除
hdel key field1 field2 # 删除属性

执行hset可能会抛出无法保存快照的错误,可以执行如下命令:

1
config set stop-writes-on-bgsave-error no

列表操作

1
2
3
4
5
6
7
8
9
10
# 插入
lpush key value1 value2 # 左侧插入
rpush key value1 value2 # 右侧插入
linsert key before/after old_key new_key # 在old_key前/后插入数据new_key
# 显示
lrange key start stop # 从几到几,-1表示最后一个
# 修改
lset key index value
lrem key count value # 删除几个某元素,0表生所有;>0表示从左向右;<0表示从右向左

集和操作

1
2
3
4
5
6
7
# 增加
sadd key value1 value2
# 获取
smmbers key # 获取所有元素
# 删除
srem key value1 value2 # 删除某些元素

有序集和

1
2
3
4
5
6
7
8
9
# 增加
zadd key score1 member1 score2 member2
# 获取
zrange key start stop
zrangebyscore key min max # 查看权重在区间的元素
zscore key member # 查看权值
# 删除
zrem key member1 member2
zremrangebyscore key min max # 删除权重在区间的元素

与 Pyhton 交互

安装Redis包

1
pip install redis

使用

1
2
3
4
5
6
7
8
9
from redis import *

# 连接数据库,参数:主机名;端口;数据库编号
sr = StrictRedis(host='localhost', port=6379, db=0)

res = sr.set('key', 'value') # 返回布尔值,表示是否成功。
res = sr.get('key') # 如果有,返回该值;没有,返回None
res = sr.delete('key') # 返回删除成功的数量
res = sr.keys(pattern='*') # 返回列表

配置Django中保存session到Redis

1
pip install django-redis-sessions

在setting.py中配置Redis

1
2
3
4
5
6
7
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
# 键前缀
SESSION_REDIS_PREFIX = 'session'

使用方法依然不变

1
2
request.session['key'] = 1
num = request.session['key']

Redis 主从

在Redis中,主从的数据是共享的,也就是实现了数据的冗余保存,这样可以防止一台机器挂掉后数据丢失的问题。一个Redis主机可以有多个从机,一个从机也可以有多个从机。写数据要在主机中,从机可以读取数据。这样也可以实现数据的读写分离。一般情况下,一个网站的数据读写比例为 10:1 ,因此可以配置多个从机用于读取数据。

主机配置可以保存不变,只是IP地址应该使用局域网或公网IP。配置完成运行服务。
从机配置,并启动。

1
2
3
bind 本机IP
slaveof 主机IP 主机PORT
port 从机PORT,不能与主机冲突

查看某机角色以及状态。

1
redis-cli -h 某机IP -p 某机PORT info Replication

Redis 集群

当用户量达到一定量级时,就需要将Redis服务规模升级为集群。

配置过程

首先配置3个配置文件,

1
2
3
4
5
6
7
8
port 7000
bind 本机IP
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
1
2
3
4
5
6
7
8
port 7001
bind 本机IP
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes
1
2
3
4
5
6
7
8
port 7002
bind 本机IP
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes

之后依据这3个配置文件启动3个Redis服务。

使用命令运行集群

1
2
3
4
5
6
7
8
# 复制程序
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin
# 安装依赖
sudo gem install redis
# 安装Ruby,保证是最新版
sudo apt-get install ruby
# 创建集群
redis-trib.rb create --replicas 1 IP_1:PORT_1 IP_2:PORT_2 IP_3:PORT_3

创建完成后,会输出几个Redis主机和从机,几个主机分别存储一部分数据,按数据槽存储,槽编号范围是0 ~ 16383。

与Python交互

1
pip install redis-cluster
1
2
3
4
5
6
7
8
9
10
11
12
13
from rediscluster import *

startup_nodes = [
{'host': '', 'port': PORT_1} # Redis主机
]

src = StrictRedisCluster(
startup_nodes=startup_nodes,
decode_responses=True
)

result = src.set('key','val')