redis数据库
非关系型数据库(nosql)
键值对内存数据库,应用数据量不是很大,高并发,增删频繁对增删性能要求高
key只能是字符串
value:字符串,哈希map, list,set,sorted set.
特点:
高性能 读写速度是10万次每秒左右
原子性 数据的准确性
持久存储 RDB/快照;AOF/日志
主从结构 master-slave ;针对高并发,实现负载均衡2.高可用(挂一台继续可以使用)
redis3.0支持集群: 内存是集群的每台电脑的和
1.解压
2.改名
3.编译 make
make install ;将src下的文件复制到src/local/bin;相当于添加到环境变量,任何目录可以执行。
4.复制配置文件到/etc/
修改/etc/redis.cof 后台启动yes,日志存储位置
daemonize yes(后台运行)
logfile /usr/local/redis/log(日志文件,目录必须存在)
redis-server /etc/redis.cof
查看:ps -ef | grep redis
5.redis-cli客户端连接
rdis-cli -h 127.0.0.1 -p 6379同上 默认
6.quit退出
7.redis-cli shutdown关闭服务
修改进入虚拟机进入路径 vi ~/.bashrc cd/usr/local source ~/.bashrc
redis 16个数据库,默认客户端连接0号数据库 select 2选择数据库
插入数据set a 1 查看 keys *
flushall 清空所有数据库 并不完全隔离
flushdb清空当前数据库
命令(命令不区分大小写)
set key value
keys * ? \?特殊字符转义key中有?
exists key 是否存在
del key 删除成功返回1
type key 返回值类型
help set(set用法)
String
set/get
mset/mget批量增加查询
incr/incrby/incrbyfloat
decr/decrby 递减值,指定步长递减
append 拼接字符串返回长度
strlen 获取长度
Hash
常用存对象
hset/hmset
hget/hmget/hgetall
hexits
hincrby 值的属性自增步长
hdel
hkeys/hvals
hlen
list
lpush list1 a
rpush list2 b 从右边添加元素
lrange list1 0 2 查询
lpop list1 从左边出栈
rpop
llen list1
lrange list 0 -1 查询所有
lindex list1 2 指定位置元素
lset list1 o a 修改
ltirm list1 0 2 截取
set
sadd set1 a 添加成功返回1
smembers set1 获取所有元素
srem set1 a 删除元素a
sismember 判断是否存在元素
del set1
sdiff set1 set2差集顺序有关 sinter交集 sunion并集
sdiffstore set3 set1 set2
scard ste1 长度
spop ste1 随机取一个元素
sorted set 有序集合类型 散列表和跳跃表
list 双向链表
zadd zset1 10 a
zscore zset1 a 获得元素分值
zrange zset1 0 -1 获得所有元素
zrevrange zset1 0 2 前三名
zrangebyscore zset1 2 10 闭区间
zrangebyscore zset1 2 (10 开区间
zincrby zset1 100 a
zcrad zset1
zcount set1 1 10
zrem zset1 a
zadd zset1 +inf m 正无穷 最大值
zadd zset1 -inf n
set命令 如果key有其他类型值 set覆盖就值无视类型。
利用java代码操作redis
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
使用jedis 依赖 第三方jar
单机连接 new Jedis(host,port);
单机连接池连接:new JedisPool(config,host,port)
开放6379端口
redis中的键生存时间
expire key time
查看剩余生存时间:ttl key
-2:键不存在或者键已经被删掉
-1:永久键
>-1:处于剩余生存时间内
取消生存时间:persist key
应用场景:
手机验证码
积分排行榜
限时促销
redis事务
multi
......
exec
一组命令一块执行,执行这组命令不被其他命令插入
redis事务和基本命令一样,都是最小单元
没有回滚
语法错误编译时错误,不会被执行
运行错误,导致有些命令成功有些失败;
事务命令不会立即执行,只有提交事务才执行,incr命令时(睡觉),其他命令插入,会有问题
使用watch :
监控指定键值,当值变化时停止后面事务,利用递归总有一次执行。
编译异常不会执行,
运行异常 会执行没有回滚;
sort排序
help sort
sort list1 by score:* 根据成绩排序
list1中的值对应score:1234如果score对应的参考建值不存在,则值为0
sort list2 by stu:*->age 根据hash值的年龄排序
sort list2 by stu:*->age get # get stu:*->age get stu:*->name
根据年龄排序 返回 id 年龄 姓名
如果排序数据量很大,尽量使用store参数将结果缓存
发布订阅
subscribe 频道名称
publish 频道名称 消息
先进先出队列
list :lpush rpop 左进右出
优先级
brpop list1 list2 list3 timeout 阻塞3秒,设置优先级
redis 管道
向redis数据库批量入库一批数据,建议使用管道提高速度
redis-cli 没有实现,在jedis中实现。
redis持久化
RDB 快照方式
当满足一定条件,redis会执行快照操作,在本地生成一个dum.rdb快照文件
可以定时备份数据库
可能会丢失最后一次备份以后的数据
aof日志文件
redis如果运行很久,日志文件很大,redis会重写
针对当前状态生成命令保存日志文件,把之前的覆盖掉
如果两种都开的话,先动态切换开启aof再修改配置文件
config set appendonly yes
redis 安全策略
设置数据库密码
修改配置requirepass password
验证密码auth password
bin ip 指定ip访问,可以跟多个ip
redis-cli
info 查看信息
monitor调试命令,监视
redis.cn
redis.or
redis优化
限制内存大小 maxmemory
数据总量不可预估,内存有限 设置限制内存大小
maxmemory-policy 内存不足时 ,数据清除策略
内存清楚策略
lru算法
主从结构
搭建(同上)
在从节点的配置文件中slaveof
原理
当从节点启动时 向主数据库发送sync同步命令
主节点接到命令会保存快照(rdb),同时将接收到的命令缓存起来
快照完成发送给从节点快照文件和缓存命令
从节点载入快照文件,执行缓存命令
启动之后主从同步 通过命令实现
slaveof no one 将从节点设为主节点
读写分离
人为实现 在代码中 封装两个工具类,一个读,一个写
主节点持久化,或者设置为挂掉之后不重启。
redis sentinel
监控
提醒
自动故障转移
主从+sentinel架构
sentinel监控每个节点并且sentinel之间也有通信
主观下线状态:
单个sentinel服务对节点做出下线判断
客观下线状态:
多个sentinel服务对主节点做出的下线判断
(sentinel与节点通信如果没有通信判断下线,当客观下线时才会执行故障转移)
主节点:主观下线和客观下线
从节点:主观下线
启动sentinel服务
复制 sentinel.cof
修改 sentinel monitor mymaster1 ip port 2
启动 redis-sentinel /ect/sentinel.cof前台启动可以加入daemonize yes设置后台启动
定义频道信息进入sentinel
redis-cli -p 26379
subscribe -sdown主观下线
redis集群
redis 集群中有slot哈希槽
默认有16384个哈希槽
哈希槽分配到所有集群主节点中
redis集群中数据存储到slot中
搭建集群
sed -i "45s/6379/7000/" redis.cof
集群扩容
添加节点 添加完主节点之后是个空的 需要分配哈希槽
./redis-trib.rb add-node 新增节点 集群节点
./ redis-trb.rb reshard 集群节点 重新分配哈希槽
分配各个
接收节点的id
从哪分配哈希槽 all
添加从节点
./redis-trib.rb add-node 新增节点 集群节点
redis-cli -c -p 从节点端口 cluster replicate 要成为的主节点的id
删除节点
删除从节点
redis-trib.rb del-node 192.168.1.160:7000 7002e2b66b9d3b384981bcbe7d09954638ed82fb
删除主节点
将哈希槽分配给其他主节点,
指定谁接,只能是某个节点id,继续输入要删除掉节点id,done
删除
java 操作redis集群
总结2:
config命令
config set
config get *
设置后立即生效,redis重启失效
2.安全策略
设置密码 requirepass oassword
验证密码 auth password
绑定ip bind ip只能本机访问redis数据库
命令重命名
rename-command flushall clean
金庸命令
rename-command flushall ""
redis客户端
redis-cli
info
monitor 监视器
redis的内存相关
redis的存储能力和服务器的可用内存相关
100w个键值对会占用100M左右内存
redis优化
键值优化,名字或者键值精简
slowlog 查看慢查询日志
slowlog get
限制redis内存 什么时候需要限制内存
不限制时会使用linux的swap分区,redis性能下降
maxmemory 限制可用内存
开启持久化 设置为系统内存的45%
没开启持久化 设置为系统内存的95%
限制内存后占满内存不在添加数据,希望添加的话设置清楚策略
应用场景
主从复制
高并发性能,节点挂掉数据不安全
实现负载均衡,实现高可用
sentinel
主从复制:主从节点不能自动切换,如果主节点挂,主从架构不能添加数据
使用sentinel来解决
监控主从节点,主节点挂掉,自动将从节点切换为主节点,就是自动故障转移
jedissentinelpool类 java操作
集群
主从+sentinel数据的存储容量每提高,单节点存储能力有限
集群实现扩容
jedisCluster类 java操作
|
|