本文的架构如图
缓存与redis
首先本文的讨论局限在服务端分布式缓存的基础之上,前端缓存等暂不在考虑之列.
1.什么是缓存?
首先由于我们服务端的数据大部分情况是保存在数据库中的,而数据库其实是持久化到磁盘中的,这样才能保证数据不会丢失.但是同时安全和高效通常是互斥的,因为安全存储在磁盘中,必然导致cpu读取数据速度慢.安全是保证了,但是不能保证高效特别是一些热点数据的查询使用,比如我们的商城项目中的热点商品的数据,因为热点所以很多人搜索,如果我们依然从数据库中查询数据,则会导致处理熟读特别慢.于是缓存的作用就出来了.
缓存:缓存就是将数据存储在内存中,但是由于存储在内存中,内存中的数据在系统关闭之后会清理掉,所以怎样设计缓存,既要保证高效有要保证不会丢失呢?
2.java缓存技术的对比
redis与memcached以及数据库的对比
Redis和Memcached的其他区别如下:
- 1、Redis和Memcached都是将数据存放在内存中,都是内存数据库。不过Memcached还可用于缓存其他东西,例如图片、视频等等;
- 2、Redis不仅仅支持简单的K/V类型的数据,同时还提供List,Set,Hash等数据结构的存储;
- 3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的Value 交换到磁盘;
- 4、过期策略–Memcached在set时就指定,例如:set key1 0 0 8,即永不过期。Redis可以通过例如expire
设定,例如:expire name 10; - 5、分布式–设定Memcached集群,利用magent做一主多从;Redis可以做一主多从。都可以一主一从;
- 6、存储数据安全–Memcached挂掉后,数据没了;Redis可以定期保存到磁盘(持久化);
- 7、灾难恢复–Memcached挂掉后,数据不可恢复; Redis数据丢失后可以通过AOF恢复;
- 8、Redis支持数据的备份,即Master-Slave模式的数据备份;
- 9、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和Session等。
总结:
- 安全:redis支持灾难恢复,因为redis可以持久化到硬盘,memechache一旦挂掉数据不可恢复.
- 功能多样性:redis支持多种数据类型存储,memcached支持string.但是memcached可以村吃图片视频等.
- 命令便捷性:redis操作命令更加多样性,操作更加的方面.
- 所以总体来说,redis相对memcached更优一些.
redis
一.redis的概述
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。edis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis的特点:
1.性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s
2.单线程操作,所以完全没有并发相关的问题,如并发锁等问题.
3.丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 及bitmap数据类型操作。
4.原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行,内置LUA脚本.
5.丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key 过期等等特性,可用作消息队列等使用.
6.安全-支持主从,定时备份持久化等策略.
7.缓存淘汰-多种缓存淘汰策略,助力筛选热点数据,保证内存不会无限扩容.
二.redis的安装及其他命令
1.安装命令及步骤
(1)上传安装文件或者下载安装文件
(2)解压redis
解压命令:tar -xvf redis-5.0.4.tar.gz
(3)编译安装redis
说明:在redis根目录中执行指令
编译命令: make
安装命令: make install
(4)校验
命令: redis-server
这就表示redis安装成功.
2.配置文件
redis.conf
说明:由于redis的配置文件包含很多的内容,所以我们在后面的操作中用到了在分享,这里只做简单的配置.
进入编辑:redis.conf
(1)修改ip绑定
ip绑定的意思,是我们的redis服务只能由哪些IP地址访问本redis服务,如果绑定本地:127.0.0.1表示本redis只能被本机的程序访问,不能通过远程访问本redis服务.
(2)关闭保护模式
(3)后台启动
其他的命令请自寻查看redis官网其他命令
3.服务启动和停止
(1)服务启动命令
后面的redis.conf表示指定加载哪个配置文件来启动
redis-server redis.conf
(2)进入/退出客户端
这个命令-p代表的是进入哪个端口号的redis,redis默认的端口号是6379,如果不指定端口号表示进入默认的6379
- 进入客户端(就和连接数据库一样的道理): redis-cli -p 6379
- 退出客户端: ctrl+c exit quit
(3)停止redis服务
redis-cli -p 6379 shutdown
redis-cli shutdown :未指定端口号表示停止默认端口也就是6379端口号的redis
或者直接用杀死进程的方式:
kill -9 进程号
4.redis 安全相关的操作
因为redis在生产环境中,作为我们重要资源的存放地,比如要有安全相关的设置,redis提供了大致两种的策略.
-
一种是绑定ip,指定只能具体的ip地址才能访问本redis服务.
-
配置redis连接密码
校验密码是否设置成功:
输入密码: auth 密码
5.事务命令
命令
multi – 开启事务
exec --提交事务
discard–回滚事务
watch --监听
unwatch – 取消监听
三.redis的存储类型,及操作
redis 支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
1.string
大致命令如下:
具体操作:
2.hash
说明:可以用散列类型保存对象和属性值
例子:User对象{id:2,name:小明,age:19}
具体操作:
3.list
说明:
- Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
- List集合可以当做队列使用,也可以当做栈使用
- 队列:存入数据的方向和获取数据的方向相反
- 栈:存入数据的方向和获取数据的方向相同
具体操作:
4.set集合
set集合是去重复的集合,他有很多功能可以用:
例如微信的共同好友,等等
具体操作:
5.sort set集合
sort set集合常用来统计作为帖子的最高回复量等,人气,以及游戏排名等.
操作:
6.bitMap 可以用来统计用户登陆状态等
SETBIT key offset value
其实可以理解key代表一个bitmap的名字.offset代表这个bitmap中的偏移量,value代表这个偏移量的值.
设置或者清空key的value(字符串)在offset处的bit值(只能只0或者1)。
例如:
记录今天用户的登陆状态.
key就是 active:20200708
offset就是 userId
则:
setbit active:20200708 userId.getbyte() 1
解释:active:20200708这个名字的bitmap中,偏移量为userId.getbyte()的位置上的值为1.
具体请看接下来的应用场景文章:
四 redis的持久化策略
具体可参考这篇文章:
https://baijiahao.baidu.com/s?id=1654694618189745916&wfr=spider&for=pc
说明:
Redis会根据配置文件的规则,定期将内存中的数据持久化到磁盘中.当redis重新启动时,会根据配置文件.实现内存数据的恢复
1.RDB(Redis DataBase)模式–内存快照
说明:RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
save、bgsave、自动化。我们分别来看一下
特点:
①RDB模式定期实现数据的持久化 (可能会丢失数据)
②RDB模式记录的是内存数据的快照.持久化文件较小.
③RDB模式在进行持久化操作时是阻塞的.(数据安全性考虑)
④一般使用持久化的策略RDB的效率是最高的.建议使用.
配置文件:
2.AOF模式–内存快照
说明:AOF模式默认是关闭的.如果使用需要开启.AOF模式最的是数据的追加.所以持久化文件较大.
特点:
①AOF模式默认是关闭的.
②AOF模式持久化时记录用户的操作过程,之后追加到持久化文件中.
③AOF模式可以实现实时备份.保证数据安全.
④AOF模式效率低于RDB模式
⑤AOF持久化文件需要定期维护.
⑥AOF模式是异步的不会陷入阻塞
AOF模式持久化策略
配置文件732行
- appendfsync always 用户做一次操作,持久化一次
- appendfsync everysec 每秒持久化一次
- appendfsync no 由操作系统决定何时持久化. 一般不用\
五 redis的缓存淘汰机制
1.常用的淘汰算法:
- FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
- LRU(时间):Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
- LFU(次数):Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。
2 .redis的内存优化算法
-
1.volatile-lru 设定超时时间的数据采用lru算法进行删除
-
2.allkeys-lru 所有数据采用LRU算法进行删除.LFU redis5.0版本以后的算法.
-
3.volatile-lfu 设定超时时间的数据,采用lfu算法
-
4.allkeys-lfu 所有数据采用lfu算法.
-
5.volatile-random 设定超时时间的随机算法
-
6.allkeys-random 所有数据的随机算法
-
7.volatile-ttl 设定超时时间的数据按照可存活时间排序删除
-
8.noeviction 默认设定 如果内存满了不会删除数据,而是报错返回,有使用这自行决定.
3.redis.conf文件中的策略设置