Redis
一、NoSql
NoSQL(Not Only Sql),泛指非关系型的数据库。传统项目网站访问量一般不大,单机版数据库就很不错, 随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
常见NoSql: Redis(K-V)、MongoDB(文本)、HBase(海量数据)、Cassandra(阿帕奇)、Memcached(K-V)
Redis,一种典型的K-V数据库,支持五种数据结构。本次使用当前最新稳定版redis 5.0.7.历史版本下载地址。redis菜鸟教程。不遵循SQL标准、对数据并发读写、不支持事务、对数据提高可拓展性。对关系型数据库进行水平切分、垂直切分、读写分离、破环一定业务逻辑换取性能。
例子:分布式架构session共享问题,传统session存储服务器端,当使用nginx时,后台多个服务器时,session只存在一个服务器,经过负载均衡后服务器切换了,那session信息怎么办?
1.存入cookie中?cookie在客户端,那么不安全,并且网络负担效率低。
2.存文件服务器或数据库里?大量磁盘IO,效率低下
3.session复制?将session复制放入每台服务器,session数据冗余,节点越多浪费越大。
3.存入redis中?使用redis作为缓存数据库,完全存入内存中,速度快、数据结构简单。
二、安装
因为是C语言写的,所以安装编译必须要有gcc的环境。
1.wget安装 注:我安装/opt/application/目录
wget http://download.redis.io/releases/redis-5.0.7.tar.gz 下载
tar xzf redis-5.0.7.tar.gz 解压
cd redis-5.0.7 进入
make 编译,先确保gcc环境无误
2.压缩包安装 先官网准备压缩包
$ 将下载的.tar.gz压缩包放入Linux
$ tar xzf redis-5.0.7.tar.gz 解压
$ cd redis-5.0.7 进入
$ make 编译
3.常用/opt/application/redis-5.0.5/src 配置文件/opt/application/redis-5.0.5
redis-check-aof 修复有问题的AOF文件
redis-cli 客户端
redis.conf 配置文件
redis-sentinel 哨兵
redis-server 服务端
sentinel.conf 哨兵配置文件
启动:先启动server端会在前台运行 去配置文件中设置后台启动 ,在配置文件136行 daemonize yes,建议先拷贝一份配置文件。对应一个配置文件就是启动一个redis
redis-server redis.conf 启动服务端
redis-cli 启动客户端 -p 3306
redis-cli shutdown 关闭客户端及服务器
启动时能够自定义配置文件位置
三、增删改查(push/pop、add/remove、取交集、并集、差集)
1.常用
select <index> 0-15号库
keys * 获取所有键的值
type <k> 查看该键的类型
del <k> 删除该键
expire <k> <decinds> 设置键的过期时间
ttl <k> 查看改键过期情况 -1永不过期 -2已过期
dbsize 查看库的key数量
Flushdb 清空当前库
Flushall 通杀全库
CONFIG SET loglevel "notice"设置配置文件中的值
CONFIG GET loglevel 查看配置文件中的值
2.string是redis的最基本类型,string类型是二进制安全的,意味着redis的string可以包含任何数据,比如图片或者文本,一个Value最大512M
set <k> <v> 设置键值
get <k> 获取
append <k> <v> k后追加v
strlen <k> k的长度
setnx <k> <v> 有k不成功,没k才成功
incr <k> 将k的数字加一
decr <k> 将k的数字减一
incrby <k> <步长> 设置步长
decrby <k> <步长>
mset <k> <v> <k> <v>…… 一次设置多个键值对
mget <k> <k> …… 一次查询多个键值对
msetnx <k> <v> <k> <v>…… 一次设置多个键值对,不存在时
getrange <k> <起始位置> <结束位置> 像substring 包前不包后
setrange <k> <起始位置> <结束位置> 像replace 替换
setex <k> <过期时间> <v> 设置键值时直接设置过期时间
getset <k> <v> 给键赋值时,直接获得该键原来的值
3.list 单键多值,存储字符串列表.按照插入顺序排序,底层是双向链表,对两边操作性高。
lpush <k> <v> <v> …… 往表头添加 abcde edcba
rpush <k> <v> <v> …… 往表尾添加 12345 12345
lpop <k> 左侧弹出
rpop <k> 右侧弹出
rpoplpush <k1> <k2> k1右侧弹出,插入k2左端
lrange <k> 0 -1 从头查到尾,-1 0 从尾查到头
lindex <k> -1 查最后一个
llen <k> 查列表的长度
linsert <k> before <v> <new v> 插入元素
lrem <k> <n> <v> 从左边删除几个value
4.set对外提供类似于list的列表功能,特殊之处就是set能够自动排重的。底层是value为null的hash表。
sadd key [member1] [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SDIFF key1 [key2] 返回给定所有集合的差集
SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
SINTER key1 [key2] 返回给定所有集合的交集
SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
SISMEMBER key member 判断 member 元素是否是集合 key 的成员
SMOVE source destination member 将member元素从source集合移动到destination 集合
SPOP key 移除并返回集合中的一个随机元素
SRANDMEMBER key [count] 返回集合中一个或多个随机数
SREM key member1 [member2] 移除集合中一个或多个成员
SUNION key1 [key2] 返回所有给定集合的并集
SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素
四、读写分离
一主二仆,读写分离,将三台主机分为master/slave,master负责读写,slave负责度,将master的数据也要同步到从机上。配置规则:配从不配主。从库配置slaveof 主库IP主库端口。
首先准备工作:此处将6380端口作为master,6379、6381作为slave,复制之前备份的配置文件分别名命redis6380.conf和redis6381.conf,配置文件设置 92行配置端口号port 6380,136行配置后台启动 daemonize yes、 158行配置pid pidfile /var/run/redis_6380.pid、 171行配置日志名 logfile “6380.log”、253 行配置dbfilename dump6380.rdb、 263行配置dump文件位置 dir ./(根据自己情况配置)
打开三个终端,分别启动三台redis,进行主从测试。
[root@localhost ~]# ps -ef |grep redis
root 3276 1 0 10:35 ? 00:00:00 redis-server 127.0.0.1:6380
root 3281 1565 0 10:36 pts/0 00:00:00 redis-cli -p 6380
root 3311 1 0 10:36 ? 00:00:00 redis-server 127.0.0.1:6379
root 3322 2978 0 10:37 pts/1 00:00:00 redis-cli -p 6379
root 3416 1 0 10:40 ? 00:00:00 redis-server 127.0.0.1:6381
root 3426 3019 0 10:40 pts/2 00:00:00 redis-cli -p 6381
root 3490 3437 0 10:41 pts/3 00:00:00 grep --color=auto redis
[root@localhost ~]#
通过:redis客户端里 通过 info replication 查看状态,发现三台全是master,并且没有从机。此处将6379和6381客户端处输