面试问题:redis系列

memcached 与 redis 的区别?

1、Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset,hash
等数据结构的存储。而 memcache 只支持简单数据类型(
php类型
基本类型:int string boolean float
复合类型:array object resource null
),需要客户端自己处理
复杂对象
2、Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候
可以再次加载进行使用(PS:持久化在 rdb、aof)。

3、由于 Memcache 没有持久化机制,因此宕机所有缓存数据失效。Redis 配置
为持久化,宕机重启后,将自动加载宕机时刻的数据到缓存系统中。具有更好的
灾备机制。
4、Memcache 可以使用 Magent 在客户端进行一致性 hash 做分布式。Redis
支持在服务器端做分布式(PS:Twemproxy/Codis/Redis-cluster 多种分布式实现
方式)
5、Memcached 的简单限制就是键(key)和 Value 的限制。最大键长为 250
个字符。可以接受的储存数据不能超过 1MB(可修改配置文件变大),因为这
是典型 slab 的最大值,不适合虚拟机使用。而 Redis 的 Key 长度支持到 512k。 6、Redis 使用的是单线程模型,保证了数据按顺序提交。Memcache 需要使用
cas 保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,
属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操
作,不一致就放弃任何操作
cpu 利用。由于 Redis 只使用单核,而 Memcached 可以使用多核,所以平均每
一个核上 Redis 在存储小数据时比 Memcached 性能更 高。而在 100k 以上的
数据中,Memcached 性能要高于 Redis 。 7、memcache 内存管理:使用 Slab Allocation。原理相当简单,预先分配一系
列大小固定的组,然后根据数据大小选择最合适的块存储。避免了内存碎片。(缺
点:不能变长,浪费了一定空间)memcached 默认情况下下一个 slab 的最大值
为前一个的 1.25 倍。
8、redis 内存管理:Redis 通过定义一个数组来记录所有的内存分配情况,Redis
采用的是包装的 malloc/free,相较于 Memcached 的内存 管理方法来说,要简
单很多。由于 malloc 首先以链表的方式搜索已管理的内存中可用的空间分配,
导致内存碎片比较多

如何实现集群中的 session 共享存储?

Session 是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,
这样我们可以根据客户端传来的 sessionID,来获取 session,或在对应 Session
不存在的情况下(session 生命周期到了/用户第一次登录),创建一个新的
Session;但是,如果我们在集群环境下,假设我们有两台服务器 A,B,用户
的请求会由 Nginx 服务器进行转发(别的方案也是同理),用户登录时,Nginx
将请求转发至服务器 A 上,A 创建了新的 session,并将 SessionID 返回给客户
端,用户在浏览其他页面时,客户端验证登录状态,Nginx 将请求转发至服务器
B,由于 B 上并没有对应客户端发来 sessionId 的 session,所以会重新创建一
个新的 session,并且再将这个新的 sessionID 返回给客户端,这样,我们可以
想象一下,用户每一次操作都有 1/2 的概率进行再次的登录,这样不仅对用户体
验特别差,还会让服务器上的 session 激增,加大服务器的运行压力。
为了解决集群环境下的 seesion 共享问题,共有 4 种解决方案:
1.粘性 session
粘性 session 是指 Ngnix 每次都将同一用户的所有请求转发至同一台服务器上,即将用户与
服务器绑定。
2.服务器 session 复制
即每次 session 发生变化时,创建或者修改,就广播给所有集群中的服务器,使所有的服务
器上的 session 相同。
3.session 共享
缓存 session,使用 redis, memcached。
4.session 持久化
将 session 存储至数据库中,像操作数据一样才做 session。

你可能感兴趣的:(redis,java,面试,redis,java,spring,分布式)