…
NoSQL
NoSQL是一类新出现的数据库,不支持SQL语法,也不是关系型数据库,而是基于KEY-VALUE方式存储数据。他们没有通用的语言,而是各自有各自的语法和用法。他们往往适用于关系简单,而对事务强的业务有很好的支持。
NoSQL数据库常见的有:
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 sudo kill -9 PID号
sudo service redis start sudo service redis stop
redis-cli
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*' 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 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
lrange key start stop
lset key index value lrem key count value
|
集和操作
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 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') 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
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} ]
src = StrictRedisCluster( startup_nodes=startup_nodes, decode_responses=True )
result = src.set('key','val')
|