一: Nosql Redis优点:
Nosql(Not Only SQL) 非关系型数据,数据储存不需要固定的模式,无需多余的操作就可以横向扩展。
优点: 高扩展,架构灵活, 没有复杂关系
缺点: 查询功能有限
redis
优点: 速度快,一是它是一个内存数据库 二是以key value的形式存储 三是非关系型数据库;
缺点:不适合所有的数据存储 比如 重要的数据 和 经常变动的数据;
msyql是文件系统 读文件是需要通过流的方式,如果文件很多 则效率比较慢;
Redis键(key)
key*
exists key的名字 : 判断某个key是否存在
move key db : 将 key移动到db库中, 当前库中的这个key被移除了
expire key 时间 value : 给key 设置过期时间
ttl key :查看还有多少秒过期,-1 表示永不过期,-2表示已过期
type key : 查看你的key是什么类型
二:Redis-五种数据类型
对于Redis来说,它只能存储五种基本数据类型,
而现在的新版本中String、Hash、List、SortedSet(zSet)、Set
一、字符串String ----String Key-Value
字符串是Redis中最常用的类型,是一个由字节组成的序列,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据。
Value最多可以容纳的数据长度为512MB。
set key value
往key中存入一个值(value)
get key
获取键为key的值
注意:redis中的Key和Value时区分大小写的,命令不区分大小写, redis是单线程 不适合存储大容量的数据
incr key ---对应的value 自增1,如果没有这个key值 自动给你创建创建 并赋值为1
decr key ---对应的value 自减1
注意:自增的value是可以转成数字的
二、散列Hash-------key-filed-value
相当于是一个key中存在多个map。Redis中的散列可以看成具有String key和String value的map容器,可以将多个
key-value存储到一个key中。每一个Hash可以存储4294967295个键值对。
hset key filed value
设置值
hget key filed
获取值
三、集合Set
Redis的集合是无序不可重复的,此处的无序是数据不能重复。和列表一样,在执行插入和删除以及判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295。
sadd key member [member ... ] 向集合中添加元素
srem key member [member ...] 删除集合中的元素
应用场景:1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。
四、列表List
Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最大元素数量是4294967295。
应用场景:1.最新消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)
List有顺序可重复
Ipush list 1 2 3 4 从左添加元素
rpush list 1 2 3 4 从右添加元素
Irange list 0 -1 (从0到-1元素查看:也就表示查看所有)
Ipop list (从左边取,删除)
rpop list(从右边去,删除)
五、SortedSet(zSet)
有顺序,不能重复!!此处的不能重复是索引为唯一的,数据却可以重复。和Set很像,都是字符串的集合,都不允许重复的成员出现在一个set中。他们之间差别在于有序集合中每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。尽管有序集合中的成员必须是卫衣的,但是分数(score)却可以重复。
应用场景:可以用于一个大型在线游戏的积分排行榜,每当玩家的分数发生变化时,可以执行zadd更新玩家分数(score),此后在通过zrange获取几分top ten的用户信息。
适合做排行榜,排序需要一个分数属性
zadd zset1 9 a 8 c 10 d 1 e (添加元素 zadd key score member )
(ZRANGE key start stop [WITHSCORES])(查看所有元素:zrange key 0 -1 withscores)
如果要查看分数,加上withscores.
zrange zset1 0 -1 (从小到大)
zrevrange zset1 0 -1 (从大到小)
zincrby zset2 score member (对元素member 增加 score)
三:Redis架构模式:
1)单机版:简单,内存容量有限,处理能力有限,无法高可用
2)主从复制:允许一主多从,被复制的是主服务器master,复制品是从服务器slave,slave只读。能缓解主服务器的读压力,无法分解写压力,无法高可用。
master和slave实例连接正常时,master会发送一连串的命令流来保持slave的更新, 以便于将自身数据集的改变复制给slave.
3)哨兵 Sentinel会不断地检查主服务器和从服务器是否运作正常,当一个主服务器不能正常工作时,哨兵会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器使得集群可以使用新的主服务器代替失效的服务器。
4)集群 使用哈希槽,集群的每个节点负责一部分hash槽,分散写压力, 使用主从复制模式,主节点失效,会自动选举它的从节点为新主,。不能保证数据强一致性。
四: Redis持久化:持久化就是把内存的数据写到硬盘中,redis提供了两种持久化方式: RDM(默认)和AOF
1)RDM是RedisDatabase :在指定的时间间隔能对数据进行快照存储,是在某个时间点,将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件从而达到数据恢复的目的。
优点是使用单独的子进程来进行持久化,主进程不会尽心任何IO操作,保证了redis的高性能。
缺点是间隔一段时间进行持久化,如果持久化之间redis发生了故障会发生数据丢失,所有这种方法更适合数据要求不严谨的时候。
这个时间间隔时间不能频繁,因为要完整的保存整个数据集是一个比较繁重的工作,当数据集比较大的时候,会降低响应的速率。
2)AOP是Append_Only_File的缩写,记录每次对服务器写的操作,以redis协议追加保存每次写的操作到文件末尾,当服务器重启的时候会重新执行这些命令来恢复原始的数据,
优点 可以保持更高的数据完整性,使用默认的美妙策略,redis的性能依然很好,自动地在后台对aof进行重写,重写后的新aof文件包换了恢复当前数据集所需的最小命令集合;
缺点 aof文件比rdb文件大,且恢复速度慢。
五:Redis的数据过期策略是什么?内存淘汰机制都有哪些?
1.过期策略就是内存淘汰,并不是定时检查是否过期。
2.内存淘汰机制:
- 1)noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
- 2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
- 3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
- 4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
- 5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
- 6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
六:Redis的穿透和雪崩
1. 缓存穿透
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
如何避免?
1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
2.缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期
3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。