redis问题
使用redis的时候web应用中的程序是如何进行读写的? 是在服务启动的时候把mysql中的数据加载到redis中吗?
然后应用通过redis客户端进行读取 并展示, 是所有的数据都是这么做吗? 在修改数据的时候是修改到redis吗? 还是直接修改mysql?
如果修改redis 是什么时候同步到mysql ? 怎么同步呢?
如果直接修改mysql 那么要怎么同步redis?
既然是键值对,那么你想到了什么,用键值对存储,肯定是数据结构。
Redis是不是相当于一个缓存。
缓存主要是针对什么方法的,是select,还是insert,还是update。
Hibernate快照机制是什么。
缓存的作用是什么。
Redis是基于内存的数据库,也就是一种缓存机制。
缓存一般是针对查询方法的,但是也有写操作。
Redis是一种键值对的非关系型数据库,它与Mysql之间的对应关系是Mysql中的主键。
当Redis启动时候,会去Mysql中读数据,然后根据键把数据存放到Redis中。
当应用程序查找数据的时候,会现在Redis中查找,若找到了,则OK,若找不到,则去Mysql中找,找到了则把数据返回,并把该数据放到Redis中。
当应用程序写数据的时候,会先在Redis中写数据,然后Redis主键自增,然后队列处理器会定时去将二者进行同步,若同步失败,则可以直接插入到数据库中,然后清除缓存。
至于二者怎么同步,这个有很多方法,例如Mysql可以去刷新redis,这个可以在客户端软件上进行,可以让redis去同步Mysql,这个客户端可以,也有API,设定同步时间。
至于Redis如何web应用程序结合起来,关键是两点,一是肯定有Redis的API,把API拿下来,然后明白Redis是一种键值对形式的数据库,而且是内存数据库,既然是内存的数据库,今天我也跟你说了,内存存储一般都是利用一些数据结构,内存存储就是缓存。
由于Redis也算是一种数据库,那它肯定也可以是集群模式的。
Redis 持久化的方式
rdb(快照,Snapshots)
缺省情况情况下,Redis把数据快照存放在磁盘上的二进制文件中,文件名为dump.rdb。你可以配置Redis的持久化策略,例如数据集中每N秒钟有超过M次更新,就将数据写入磁盘;或者你可以手工调用命令SAVE或BGSAVE。
AOF
快照模式并不十分健壮,当系统停止,或者无意中Redis被kill掉,最后写入Redis的数据就会丢失。这对某些应用也许不是大问题,但对于要求高可靠性的应用来说,
15.redis的缓存失效策略和主键失效机制
作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略.
在Redis当中,有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除。
1、影响生存时间的一些操作
生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆盖原来的数据,也就是说,修改key对应的value和使用另外相同的key和value来覆盖以后,当前数据的生存时间不同。
比如说,对一个 key 执行INCR命令,对一个列表进行LPUSH命令,或者对一个哈希表执行HSET命令,这类操作都不会修改 key 本身的生存时间。另一方面,如果使用RENAME对一个 key 进行改名,那么改名后的 key的生存时间和改名前一样。
RENAME命令的另一种可能是,尝试将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key ,因此,新的 another_key 的生存时间也和原本的 key 一样。使用PERSIST命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个persistent key 。
2、如何更新生存时间
可以对一个已经带有生存时间的 key 执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。过期时间的精度已经被控制在1ms之内,主键失效的时间复杂度是O(1)。
EXPIRE和TTL命令搭配使用,TTL可以查看key的当前生存时间。设置成功返回 1;当 key 不存在或者不能为 key 设置生存时间时,返回 0 。
最大缓存配置
在 redis 中,允许用户设置最大使用内存大小
server.maxmemory
默认为0,没有指定最大缓存,如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置。redis 内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略。
redis 提供 6种数据淘汰策略:
- volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
- allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
- allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
- no-enviction(驱逐):禁止驱逐数据。
posted on 2018-09-06 17:03 myworldworld 阅读(137) 评论(0) 收藏 举报
浙公网安备 33010602011771号