redis
redis
Remote DIctionary Server
nosql,键值存储,可持久存储;高级的kv存储和数据结构存储(列表,字典,哈希表,集合...);数据集是保存在内存中,所以访问性能很好;周期性的将内存中的数据写到磁盘中,以实现数据的持久性功能;单线程服务器(只有一个进程或线程);支持在服务器端运行Lua脚本;支持主从模式;支持cluster技术;
redis
KV cache and store:
in-memory
持久化
主从(借助于sentinel实现一定意义上的HA)
Clustering(分布式)
数据结构服务器:
string,List,Hash,Set,sorted Set(有序集合),bitmaps,HyperLogLog
memcached
内存中的cache,不提供持久存储能力;多线程;
redis优势:
丰富的操作:hashs,sets,sorted sets,hyperloglog等
內建replication(复制)及cluster
就地更新操作
支援持久化(磁盘):避免雪崩效应
memcached优势:
多线程:善用多核CPU;更少的阻塞操作
更少的内存开销
更少的内存分配压力
可能有更少的内存碎片
存储系统有三类:
RDBMS:关系型数据库:oracle,db2,postgresql,mysql,sql server
NoSQL:非关系型:hbase,mongodb,memcached,redis,cassandra
NewSQL:分布式:aerospike,foundationdb,rethinkdb
----------------------------------------------
redis安装
epel源
yum install -y redis
rpm -ql redis
/etc/rc.d/init.d/redis
/etc/rc.d/init.d/redis-sentinel
/etc/redis-sentinel.conf
/etc/redis.conf
/etc/security/limits.d/95-redis.conf
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof
/usr/bin/redis-check-rdb
/usr/bin/redis-cli
/usr/bin/redis-sentinel
/usr/bin/redis-server
/usr/libexec/redis-shutdown
配置文件:
/etc/redis.conf
启动:
service redis restart
lsof -i:6379
进入redis:
redis-cli -h 192.168.1.114
帮助:
查看命令组帮助:help @STRING (help @按tab键补全)
查看某命令帮助:help @command help @list
CLIENT LIST:列出所有的client
SELECT 1:进入1号数据库(默认是0)
SET disto centos 设置disto的值为centos
GET disto 查看disto的值
append disto rhel 设置disto为多个值,另一只值为rhel
STRLEN disto 查看disto值的长度
SETEN disto centos 该键值不存在时,才设定值为centos(若已经存在则该操作未能执行)
SETXX disto centos 当该键值存在时,设定新的值为centos(若不存在则该操作未能执行)
keys * 查看所有的key
INCR
DECR
列表LIST操作:
LPUSH:lpush(key, value):在名称为key的list头添加一个值为value的 元素
RPUSH:rpush(key, value):在名称为key的list尾添加一个值为value的元素
LPOP:返回并删除名称为key的list中的首元素
RPOP:返回并删除名称为key的list中的尾元素
LINDEX:lindex(key, index):返回名称为key的list中index位置的元素
LSET:lset(key, index, value):给名称为key的list中index位置的元素赋值
llen(key):返回名称为key的list的长度
lrem(key, count, value):删除count个key的list中值为value的元素
集合SET操作
sadd(key, member):向名称为key的set中添加元素member
sinter(key1, key2,…key N) :求集合的交集
sunion(key1, (keys)) :求并集
spop(key) :随机返回并删除名称为key的set中一个元素
sismember(key, member) :member是否是名称为key的set的元素
srem(key, member) :删除名称为key的set中的元素member
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
有序集合Sorted-sort
zadd:向集合中添加一个元素
ZADD weekday1 1 mon 2 tue 3 wed
zcard:返回所有元素个数
zcard weekday1
zrank:按照索引排序 ,返回索引值
zrank weekday1 tue 查看集合weekday1中元素tue对应的索引号
zrange
zrange weekday1 0 2 显示集合weekday1中的第1到第3个元素
Hash操作:
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hdel(key, field):删除名称为key的hash中键为field的域
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hlen(key):返回名称为key的hash中元素个数
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
#################################################################################
基于认证访问redis
vim /etc/redis.conf
requirepass password
redis-cli -h 192.168.1.114
--->AUTH password
清空数据库:
FLUSHDB:清空当前库
FLUSHALL:清空所有库
事务:一组相关的操作,是一致性的,要么都执行,要么都不执行
通过MULTI,EXEC,WATCH等命令实现事务功能:将一个或多个命令归并为一个操作提请服务器按顺序执行的机制;不支持回滚操作;
MULTI:启动一个事务
多个命令会放在队列中
EXEC:执行事务:一次性将事务中的所有操作执行完成后返回给客户端
WATCH:乐观锁:在EXEC命令执行之前,用于监视指定数量的键;如果监视中的某任意键值数据被修改,则服务器拒绝执行事务;
connection相关命令:help @connection
AUTH password ---Authenticate to the server
ECHO message ---Echo the given string
PING [message] ---Ping the server
QUIT - ---Close the connection
SELECT index ---Change the selected database for the current connection
Server相关命令:help @server
CLIENT SETNAME connection-name ---Set the current connection name
CLIENT GETNAME - ---Get the current connection name
CLIENT KILL [ip:port] --- Kill the connection of a client
CONFIG RESETSTAT - ---Reset the stats returned by INFO
CONFIG REWRITE - ---Rewrite the configuration file with the in memory configuration
CONFIG SET parameter value ---Set a configuration parameter to the given value
INFO [section] ---Get information and statistics about the server
DBSIZE - ---Return the number of keys in the selected database
SAVE - ---Synchronously save the dataset to disk
BGSAVE - ---Asynchronously save the dataset to disk
LASTSAVE - ---Get the UNIX time stamp of the last successful save to disk
SLAVEOF host port ---Make the server a slave of another instance, or promote it as master
SLOWLOG subcommand [argument] ---Manages the Redis slow queries log
发布与订阅(publish/subscribe)
频道:消息队列
SUBSCRIBE:订阅一个或多个队列
PUBLISH:向频道发消息
UNSUBSCRIBE:退订此前订阅的频道
PSUBSCRIBE:模式订阅
redis的持久化:
RDB和AOF
RDB:shapshot,快照,二进制格式;周期性地将数据保存至磁盘:数据文件默认为dump.rdb;
客户端也可显示使用SAVE或BGSAVE命令启动快照保存机制:
SAVE:同步,在主线程中保存快照,此时会阻塞所有的客户端请求;
BGSAVE:异步,
配置文件中:
默认的保存策略:
SAVE 900 1 900秒内有1个值发生变化
SAVE 300 10 300秒内有10个数据发生变化
SAVE 60 10000 60秒内有10000个数据发生变化
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
AOf:Append Only File
记录每一次写操作至指定的文件尾部实现持久化;当redis重启时,可以通过重新执行文件中的命令在内存重建数据库;
BGREWRITEAOF:AOF文件重写;
不会读取正在使用AOF文件,而通过将内存中的数据已命令的方式保存到临时文件中,完成之后替换原来的AOF文件;
重写过程:
1>redis主进程通过fork创建子进程;
2>子进程根据redis内存中的数据创建数据库重建命令序列于临时文件中;
3>父进程继承Client的请求,并会把这些请求中的写操作继续追加至原来AOF文件;额外的,这些新的写请求还会被放置于一个缓冲队列中;
4>子进程重写完成,会通知父进程:父进程把缓冲中的命令写到临时文件中;
5>父进程用临时文件替换老的AOF文件;
配置文件中:
appendonly no 表示没有开启AOF
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec 每秒写一次
# appendfsync no 系统自行决定
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
注:持久本身不能取代备份,还应指定备份策略,对redis数据库定期进行备份;
一般RDB和AOF不能同时启用:
RDB和AOF同时启用时:
BGSAVE和BGREWRITEAOF不会同时执行;
在redis服务器启动用于恢复数据时,会优先使用AOF;
复制:
特点:
一个master可以有多个slave;
支持链式复制;
master以非阻塞方式同步数据至slave;
配置:
在slave端:
>SLAVEOF master_ip master_port
注:如果master使用了requirepass开启了认证功能,从服务器要使用masterauth password来连入服务请求使用此密码进行认证;
sentinal:
用于管理多个redis服务器实现HA
监控
通知
自动故障转移
流言协议:投票协议
程序:redis-sentinel
redis-server
过程:
1>服务器自身初始化,运行redis-server中专用于sentinal功能的代码;
2>初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器的列表;
3>创建连向master的连接;
专用配置文件:/etc/redis-sentinel.conf
# sentinel monitor <master-name> <ip> <redis-port> <quorum法定票数> 监控主节点(可以有多个)
sentinel monitor mymaster 127.0.0.1 6379 2
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000 master超时30000毫秒认为down
# sentinel parallel-syncs <master-name> <numslaves> 允许多少个从服务器向主服务器发出同步请求
sentinel parallel-syncs mymaster 1
# sentinel failover-timeout <master-name> <milliseconds> 故障转移:当主节点出现故障,将从节点提升为主节点的超时时间(默认3min)
sentinel failover-timeout mymaster 180000
主观下线,客观下线:
主观下线:一个sentinel实例判断出某节点下线;
客观下线:多个sentinel节点协商后判断出某节点下线;