redis数据库

    (1)每个redis客户端都可以有自己的目标数据库,默认客户端选择的是0号数据库,但是客户端也可以自己选择数据库。同时客户端也会记录当前的目标数据库,这个属性是一个指向redisdb数组(记录所有可连接的数据库)其中一个。

    (2)redis是个键值对数据库,由一个字典(哈希表)保存所有的键值对,这个字典成为键空间。对redis键的增删改查其实都是对键空间的操作。每次读写键之后,redis都会做一些维护操作,例如更新该数据库的键空间被命中和不被命中次数、更新键的LRU时间、如果键过期就自动删除。

    (3)redis中除了键空间外,还有一种哈希表结构的空间:过期字典。过期字典中的键都是指针,专门指向键空间中的键,值是毫秒精度的Unix时间戳。

    (4)判断了一个键为过期后,该如何去删除,什么时候会被删除呢??有三种删除策略:

           (a)定时删除:待到特定时刻删除过期键。

           (b)惰性删除:放任过期键不管,只有每次取到一个键时,判断为过期的话就立即删除,如果该键一直没被客户端查到,就一直不删。

           (c)定期删除:每隔一段时间,就去过期空间检查,至于要删除多少键,检查多少个数据库,都是由算法来决定的。

            对于上面三种删除策略,各有好坏,定时删除对于内存来讲是个好事,可以及时释放内存,但是一个很大的弊端就是,如果在某个时刻过期键特别多的话,定时操作刚好在这段时间,那么会占用相当大一部分cpu资源,对服务器响应时间和吞吐量造成影响。惰性删除对CPU来讲是最友好的,程序只有在取到键的时候才会去检查是否过期,但是有个最不好的地方就是很容易造成内存泄露。定期删除是最折中的方案,每隔一段时间去检查过期键空间,并且还可以根据当前CPU的状态来定制一个算法,来决定删除多少键和检查多少过期空间,而且也可以有效的避免内存泄露

原文地址:https://www.cnblogs.com/Booker808-java/p/10083487.html