什么样的数据适合存储在非关系型数据库
1、关系不是很密切的的数据,比如用户信息,班级信息,评论数量等等。
2、量比较大的数据,如访问记录等
3、访问比较频繁的数据,如用户信息,访问数量,最新微博等
Redis常见性能问题和解决方案:
1.Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
2.如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
3.为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
尽量避免在压力很大的主库上增加从库
4.Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
5.为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<–Slave1<–Slave2<–Slave3…,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变。
Redis的并发竞争问题如何解决?
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。
对此有2种解决方法:
1.服务器角度,利用setnx实现锁。
2.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
注:对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。
Redis持久化数据和缓存怎么做扩容
扩容的话可以通过redis集群实现,之前做项目的时候用过自己搭的redis集群
Redis实现限流功能的优点:
可以应用于分布式或者集群下
redis并发量大
为啥redis单线程模型也能效率这么高?
1)纯内存操作
2)核心是基于非阻塞的IO多路复用机制
3)单线程反而避免了多线程的频繁上下文切换问题
redis都有哪些数据类型?分别在哪些场景下使用比较合适呢?
string 简单的 kv缓存
hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在redis里,然后每次读写缓存的时候,可以就操作hash里的某个字段
list 粉丝,关注,收藏,类似微博分页,分页查询
set 查看共同好友,
sorted set 排行榜