redis是一种高级的key-value的存储系统
其中的key是字符串类型,尽可能key不要太长,会消耗内存还会降低查找效率
其中value 支持五种数据类型: (最多可以容纳的数据长度是512M)
- 字符串型 string
- 字符串列表 lists
- 字符串集合 sets
- 有序字符串集合 sorted sets
- 哈希类型 hashs
1、存储字符串string
- 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设置过期时间并且已过期,则直接删除返回空。