redis初探

简介

开源免费的,遵守BSD协议(开源,可以二次开发),是一个高性能(NOSQL)的key-value数据库。
NOSQL数据库,非关系型数据库,数据和数据之间没有关联关系,应付大数据场景。

redis安装

一、安装gcc环境,因为redis是C语言开发的,所以需要安装gcc环境,首先需要确保root登录,其次是能够登录外网。
yum -Y install gcc automake autoconf libtool make

注意:运行yum出现/var/run/yum.pid已经被锁定,PID为xxx的另一个程序正在运行的问题解决。
rm -f /var/run/yum.pid

二、安装Redis
1.wget http://download.redis.io/releases/redis-4.0.1.tar.gz
2.tar zxvf redis-4.0.1.tar.gz
3.cd redis-4.0.1
4.make或make MALLOC=libc
5.make PREFIX=/usr/local/redis install PREFIX必须大写
6.进入目录 /usr/local/redis 执行 ./redis-server redis.conf启动服务端,指定是否从服务器用参数–slave of ./redis-cli -h host -p port -a password 启动客户端

三、配置redis
1.进入到解压目录,复制redis.conf
2.复制redis.conf到安装目录下,和bin同级,即:cp redis.conf /usr/local/redis
3.redis配置文件详解
a.redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程。
daemonize no
b.当redis以守护进程方式运行时,redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定。
pidfile /var/run/redis.pid
c.指定redis监听端口,默认端口为6379,为什么选用6379作为默认端口,因为6379在手机上的按键时MERZ对应的号码,而MERZ是意大利歌女MERZ的名字。
port 6379
d.绑定的主机地址,表示哪个主机可以连接redis,注释掉之后失效
bind 127.0.0.1
e.当客户端闲置多长时间关闭连接,如果指定为0,表示关闭该功能
timeout 300
f.redis日志记录级别,redis总共支持四个级别:debug、verbose、notice、warning默认为verbose
loglevel verbose
g.日志记录方式,默认为标准输出,如果配置redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
h.设置数据路的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
database 16
i.指定在多长时间内,有多少次更新操作,就把数据同步到数据文件,可以多个条件配合
save
redis默认配置文件中提供了三个条件
save 900 1
save 300 10
save 60 10000

分别表示900秒内有1个更改,300秒内有10个更改,60秒内有10000个更改。
j.指定存储至本地数据库时是否压缩数据,默认为yes,redis采用lzf压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变得巨大。
rdbcompression yes
k.指定本地数据库文件名,默认为dump.rdb
dbfilename dump.rdb
l.指定本地数据库存放目录
dir ./
m.设置本机为slav服务时,设置master服务的IP地址及端口,在redis启动时,他会子doing从master进行数据同步。
slaveof masterip masterport
n.当master服务设置了密码保护时,slave服务连接master的密码
masterauth master-password
o.设置redis连接密码,如果配置了连接密码,客户端在连接redis时需要通过命令提供密码,默认关闭。
requirepass foobared
p.设置同一时间最大客户端连接数,默认无限制,redis可以同时打开客户端连接数为redis进程可以打开的最大文件描述符数,如果设置maxclients 0表示不做限制。当客户端连接数到达限制时,会报错max numbe of clients reached错误信息。
maxclients 128
q.指定redis最大内存限制,redis在启动的时候会把数据加载到内存中,达到最大内存后,redis会先尝试清除已经到期或者即将到期的key,当此方法处理后,仍然达到最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作,redis新的vm机制,会把key存放内存,value存放再swap区。若服务器内存为1G,则redis内存建议256-512m
maxmemory byte
r.redis内存清除策略
volatile-lru:设定超时时间的数据中,删除最不常使用的数据
allkeys-lru:查询所有的key中最近最不常使用的数据进行删除,这是最广泛的策略
volatile-random:在已经设定的超时时间的数据中进行随机删除
allkeys-random:查询所有key中进行随机删除
volatile-ttl:查询全部设定超时时间的数据之后排序,将马上要过期的数据删除
noeviction:若设置此值,则不会进行删除操作,内存满了之后报错
volatile-lfu:从所有配置了过期时间的键中删除使用频率最少的键
allkeys-lfu:从所有键中删除使用频率最少的键

四、基本操作
keys *:查询所有key
set key value :给redis存数据
get keys:查询key对应的value
关闭redis: ps -ef | grep -i redis 查询进程号,kill -9 进程号进行关闭
./bin/redis-cli shutdown 关闭redis服务,若是redis设置了密码,则需要在客户端上通过密码登录,然后进行shutdown关闭
删除key:del key 删除key 可以删除多个
序列化key:dump key 用于序列化key,并返回被序列化的值
检查key是否存在:exist key 检查指定的key是否存在
设置key过期时间:expire key seconds (秒) expire key millseconds (毫秒)
返回key剩余存活时间:TTL key (秒) PTTL key (毫秒) -1代表永久有效,-2代表key不存在
持久化key:persist key
查找所有符合条件的key:keys pattern *代表所有 ?代表一个或多个字符
从当前数据库中返回一个随机的key:random key
修改key名称:rename key newkey
将当前库中的一个key移动到指定数据库中:move key db
返回key所存储的值的类型:type key

五、应用场景
expire key seconds
1.限时优惠活动
2.网站数据缓存
3.手机验证码
4.限时网站方可访问频率

六、key的命令规范
redis单个key可以存512M大小
1.key不要太长,尽量不要超过1024个字节,这不仅消耗内存,而且会降低查找效率
2.key不要太短。太短的话,key的可读性会降低
3.在一个项目中,key最好使用统一的命名模式,例如user:123:password

七、基本数据类型
1.string
赋值:set keyname value
删除:del keyname
只有在key不存在的时候赋值:setnx keyname value
取值:get keyname
取值并截取:get keyname begin end
用于设置指定key的值,并返回key的旧值,当key不存在的时候,返回null:getset keyname value
自增/自减:incr keyname 或者 incrby keyname 自增值 decrby keyname 或者 decr keyname 自减值
应用:计数,粉丝数,关注数 保存json串
2.hash
存值:hset key field value 存多个值:hmset key field1 value1 field2 value2
取值:hget key field 取多个值:hmget key field1 field2
取所有值:hgetall key
删除:del key
自增:HINCRBY key field increment
应用:常用存储一个对象,不用string存的原因:修改某个属性,需要把整个对象取回,若用id标识存的话内存开销大
3.list
存值:lpush key value1 value2 从左侧进行添加 rpush key value1 values
取值:LRANGE key start stop 获取范围内的元素
返回列表中指定区域内的元素,区间以偏移量start和end指定,其中0表示列表的第一个元素,1表示列表的第二个元素,以此类推。
也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表倒数第二个元素,以此类推。
获取列表长度:llen key
通过索引获取元素:lindex key index
删除语法:lpop key 移除并获取列表的第一个元素,从左侧删除 rpop key 移除并获取列表的最后一个元素,从右删除
插入元素:linsert key before/after target value
移除列表的最后一个元素,并将该元素添加到另一个列表并返回:RPOPLPUSH source destination
将列表最后一个移到第一个:RPOPLPUSH source source 订单下单流程 用户系统登录注册短信
应用:对数据量大的集合数据删减 关注列表 粉丝列表 留言评价 分页 热点新闻top5
4.set
存值:sadd key member1 member2
获取集合中的成员数:scard key
获取集合中所有成员:smembers key
判断key是否存在:SISMEMEBER key member
返回key中随机的一个或多个value:SRANDMEMBER key count
SPOP key count: 移除并返回集合中的一个随机元素
SMOVE source destination member:将member元素从source集合中移动到destination集合
SDIFF key1 key2:返回给定所有集合的差集
SINTER key1 key2:返回给定所有集合的交集
SUNION key1 key2:返回给定集合的并集
应用:差集,交集,并集 共同关注,共同喜好,二度好友等功能
5.zset(有序集合)
存值:zadd key score1 member1 [score2 member2]
取值:zcard key 获取有序集合的成员数
zcount key min max:计算在有序集合中指定区间分数的成员数
zrank key member:返回有序集合中指定成员的索引
zrange key start stop:通过索引返回有序集合中指定区间的成员

八、java连接redis
jedis
结合spring之后,用redisTemplate操作redis,任何数据通过redistemplate存的时候,jdk都会默认进行序列化,需要配置
redisTemplate中把默认的序列化方式改为string的序列化操作。
edisTemplate操作hash
redisTemplate.opsForHash().put(“user”,user.getId(),user);将user对象的所有属性以hash的方式存入redis
redisTemplate.opsForHash().hasKey(key, hashKey)判断redis中是否有某个对象
redisTemplate.opsForHash().get(key, hashKey)从hash中取值
通过@Resource(name=‘redisTemplate’)可以将redisTemplate.opsForHash()做增益。
redisTemplate操作list
通过@Resource(name=‘redisTemplate’)可以将redisTemplate.opsForList()做增益。
leftPush(key, value)
rightPush(key,value)

九、redis发布订阅功能
订阅频道:
subscribe channel [channel …] 订阅给定的一个或者多个频道的信息
psubscribe pattern [pattern …] 订阅一个或者多个符合给定模式的频道
发布频道:
publish channel message 将信息发送到指定的频道
退订频道:
unsubscribe channel [channel] 退订给定频道
punsubscribe pattern [pattern] 退订所有给定模式的频道

应用场景:微信公众号,即时发送消息

十、redis多数据库
redis下,数据库时有一个整数索引标识,而不是一个数据库名称,默认情况下,一个客户端连接到的数据库是0
select 数据库 数据库切换
move key名称 数据库 :将当前数据库中的key移入指定的数据库
flushdb 清空当前数据库所有的key
flushall 清楚整个redis的数据库所有key

十一、redis事务
redis会将一个事务中的所有命令序列化,然后被顺序执行
执行中不会被其他命令插入,不允许出现加塞行为。

redis事务命令:
discard:取消事务,放弃执行事务内的所有命令
exec:执行所有事务块内的命令
multi:标记一个事务块的开始
unwatch:取消watch命令对所有key的监视
watch key [key]:监视一个或多个key,如果在事务执行之前这个key被其他命令所修改,那么事务将被打断。

十二、redis持久化
RDB:默认持久化机制,RDB相当于快照,保存的是一种状态。
优点:快照保存数据极快,还原数据极快。适用于灾备备份。
缺点:小内存机器不适合使用,RDB机制符合要求就会快照,意外dang机,会丢失最后一次未快照的数据
条件:服务正常关闭时,key满足清除条件时,会产生快照
AOF:APPEND only file 比快照方式有更好的持久性,由于使用aof持久化方式时,redis会将每个收到的写命令通过write函数追加到文件中,当
redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
三种方式:(每秒会fsync一次)

十三、redis缓存同步数据库
解决方案:
实时同步:
对强一致要求比较高的,应采用实施同步方案,即查询缓存查询不到再从DB中查询,保存到缓存,更新缓存时,先更新数据库,再将缓存的设置过期。(建议不要直接更新缓存内容,不要直接删除key)
@Cacheable:查询时使用,注意long类型需转换为String类型,否则会抛异常
@CachePut:更新时使用,使用此注解,一定会从DB上查询数据
@CacheEvict:删除时使用
@Caching:组合用法

异步队列:
对于并发程度较高的,可采用异步队列的方式同步,可采用kafka等消息中间件处理消息生产和消费。

使用阿里同步工具canal:
模拟master和slave

使用数据库的触发器
定时任务

十四、缓存雪崩
如果缓存集中再一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
1.加锁排队,限流算法:计数 滑动窗口
2.令牌桶
3.漏桶
4.缓存预热:自己访问缓存

十五、缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中时需要从数据库查询,查不到数据则不写入缓存,浙江导致这个不存在的数据每次请求都要到数据库取查询造成缓存穿透
解决办法:
持久层查询不到就缓存空结果,查询时先判断缓存中是否存在,如果存在直接返回空,没有则查询后返回。
注意:insert时需要清楚查询的key,否则即使DB中有,缓存中还是查询不到。

十六、redis高级
redis实现分布式锁:SETNX key value 存入一个不存在的字符串键值对 若key存在,则不进行任何操作。
RDB:bgsave 产生了一个rdb文件,非阻塞方式。拷贝引用, RDB不是叠加的,下次开始的时候前一次数据就会清零。
RDB优点:完全备份,不同时间的数据集备份可以做到多版本恢复。
紧凑的单一文件,方便网络传输,适合灾难恢复
恢复大数据集速度较AOF快
缺点:会丢失最近写入,修改的而未能持久化的数据
fork过程非常耗时,会造成毫秒级不能相应客户端请求

redis哨兵:
sentinel monitor
监视name的主服务器,服务器ip和端口,将这个主服务器判断未下线失效至少需要2个Sentinel同意,如果多数Sentinel同意才会执行故障转移。
redis twemproxy:
数据水平拆分。
redis集群:
redis 4.0
16384槽位
集群的时候,进来的key先通过crc16算法和16384取模,取到的模的范围为0-16383之间,再将槽位和服务器节点进行对应,对应完之后再将数据分到不同的服务器节点上去。
横向是分片提供横向拓展能力,横向上面的每个服务器节点存在单点故障的风险,因此,这些节点上面是使用主从哨兵模式进行灾备。

AOF:append only file 采用追加的方式保存
默认文件appendonly.aof
写入机制:不能保证数据绝对不丢失。
目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常不会直接将内容写入硬盘里面,二十将内容放入一个内存缓冲区,等到缓冲区被写满或者用户执行fsync调用和fdatasync调用时才将储存在缓冲区里面的内容真正的写入到硬盘里面,为写入硬盘之前,数据可能会丢失。
写入磁盘的策略:appendfsync选项,这个选项的值可以是always,everysec或者no
always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘,这种模式下,服务器出现故障,也不会丢失任何已经成功执行命令的数据。
everysec(默认):服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到硬盘,这种模式下,服务器出现故障,最多丢失一秒中内执行的命令数据。
no:服务器不主动调用fdatasync,由操作系统决定何时将缓冲区的命令写入到硬盘,这种模式下,丢失命令的数量是不确定的。
always慢,everysec和no都很快。

AOF重写机制:没有必要存在的语句删除,优化在的语句。
优点:
写入机制:默认fsync每秒执行,性能很好不阻塞服务,最多丢失一秒的数据
重写机制:优化aof文件
如果误操作了flushall等,只要aof未被重写,停止服务移除aof文件尾部的flushall命令,重启redis,可以将数据集恢复到flushall执行前的状态。
缺点:
相同数据集,aof文件体积较rdb大很多
恢复数据速度比rdb慢

存数据的方式:分片,镜像全量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值