Redis相关

redis是一种高级的key-value的存储系统

其中的key是字符串类型,尽可能key不要太长,会消耗内存还会降低查找效率

其中value 支持五种数据类型:  (最多可以容纳的数据长度是512M)

  1. 字符串型 string
  2. 字符串列表 lists
  3. 字符串集合 sets
  4. 有序字符串集合 sorted sets
  5. 哈希类型 hashs

1、存储字符串string

  1. set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”

     2. get key:获取key的value。如果与该key关联的value不是String类型,redis 将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返 回null。

     3. incr key:将指定的key的value原子性的递增1.如果该key不存在,其初始值 为0,在incr之后其值为1。如果value的值不能转成整型,如helloworld,该操作将执 行失败并返回相应的错误信息。

    4. decr key:将指定的key的value原子性的递减1.如果该key不存在,其初始值 为0,在incr之后其值为-1。如果value的值不能转成整型,如helloworld,该操作将执 行失败并返回相应的错误信息。

127.0.0.1:6379> set helloworld abcd 
 OK 

127.0.0.1:6379> get helloworld 
"abcd"

5、存储hash

可以看成具有String Key和String Value的map容器。所 以该类型非常适合于存储值对象的信息。如Username、Password和Age等。

  (1)hset key field value:为指定的key设定field/value对(键值对)。

  (2)hgetall key:获取key中的所有filed-vaule

  (3) hget key field:返回指定的key中的field的值

  (4)hmset key fields:设置key中的多个filed/value

Redis里面存放的都是key-value形式的数据,但是里面的内容全部都是字符串,我们不可能把一个java对象放到Redis数据库里面,但有时又有可能要存一个java对象进去,把java对象转换成json字符串,这时候就可以存进去了,

根据内容分类id去查询内容信息,key应该用内容分类id作为key,value呢?我们之前是根据内容分类id查询到一个内容列表,很显然这个内容列表就是一个java对象,我们可以把它转成json,然后把它存到Redis里面去就可以了。这个缓存不可能只是为内容作缓存,有可能还会对商品、用户、…作缓存,这个时候key就会很多,用内容分类id作为key的话,有可能会重复,我们要防止key冲突,我们得对这个key进行归类,可以使用hash来对其进行归类。 

设置key的过期时间:     expire key second       以毫秒计。key过期后将不再可用设置成功返回1。当key不存在或者不能为key                                                                               设置过期时间时返回0。

命令查看key的有效期:    ttl    key                  设置key的过期时间成功后 ,如若返回正数,则说明正在倒计时;返回-1,则说明                                                                           这个key是持久化的;返回-2,则说明这个key是不存在的。 
清除key的过期时间:     persist    key            使其持久化,如若返回0,则说明持久化没成功;返回1,则说明持久化成功。

Redis持久化方案

即将数据从内存中保存到磁盘上。Redis的持久化存储提供两种方式:快照(RDB文件)和追加式文件(AOF文件)

快照(RDB文件):是Redis默认支持的持久化方案,会在一个特定的间隔保存那个时间点的一个数据快照

追加式文件(AOF文件):会记录每一个服务器收到的写操作。把所有对Redis数据库操作的命令,即增删改操作的命令,保存到一个文件中。

Redis为什么这么快

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

3、使用多路I/O复用模型,非阻塞IO;多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

Redis的几种淘汰策略

redis 是基于内存来进行高性能,高并发的读写操作的,既然是内存,那就与空间限制,如果一直往里面添加数据,那肯定不行,所以需要采用一些过期策略把不需要的数据删除或者淘汰掉。内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)

  • volatile-lru:从已设置过期时间的数据集中  挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集中  挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中  任意选择数据淘汰
  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集中任意选择数据淘汰

定期删除(第三点):就是redis默认是每隔100ms就随机抽取一些设置过期时间的key值,检查是否过期,如果过期就删除。

随机抽取式因为如果redis中设置过期时间的key值很多的话,每次都检查所有key,CPU基本都消耗在检查所有过期key了,对外的性能也将大大降低。

同时,随机抽查也存在一些问题。会导致一些已过期的key没有被扫描到,继续留在内存中占有空间。

可以采用懒性删除,,就是在获取某个key的时候,redis会检查一下,如果这个key设置过期时间并且已过期,则直接删除返回空。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值