设为首页 收藏本站
查看: 993|回复: 0

[经验分享] memcached和redis相关

[复制链接]

尚未签到

发表于 2016-12-19 08:07:43 | 显示全部楼层 |阅读模式
  memcached: c实现的服务端,java实现的客户端有很多spymemcached据说代码写的不咋的
  我们现在用的xmemached;国产的也是基于nio实现
  1:memcached特点
  2: 协议
  3: 原理简介 
  memcached: 内存keyvalue结构,很好的水平扩展,容易集群;不支持持久化

memcached在数据删除方面有效利用资源

数据不会真正从memcached中消失

 memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible,透明), 其存储空间即可重复使用。

Lazy Expiration

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。 这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。(和redis超时机制差不多)

LRU:从缓存中有效删除数据的原理

memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况, 此时就要使用名为 Least Recently Used(LRU)机制来分配空间。 顾名思义,这是删除“最近最少使用”的记录的机制。 因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。 从缓存的实用角度来看,该模型十分理想。
不过,有些情况下LRU机制反倒会造成麻烦。memcached启动时通过“-M”参数可以禁止LRU,如下所示:

$ memcached -M -m 1024
启动时必须注意的是,小写的“-m”选项是用来指定最大内存大小的。不指定具体数值则使用默认值64MB。
指定“-M”参数启动后,内存用尽时memcached会返回错误。 话说回来,memcached毕竟不是存储器,而是缓存,所以推荐使用LRU。
  2: 分布式算法,一致性hash
  3:单个命令式原子的,提高cas操作
  4:memcached高并发失效问题:
  1:缓存失效时候,很可能高并发查询DB的情况
  就是在你比如缓存了key=list vlaue=xxx的对象时候,失效了导致很多线程过来查询db
  解决方法: 后台定时一个任务去更新缓存,显然不可取
  在失效的时候保证只有一个线程进入db,先更新缓存,如何保证只有一个线程更新呢?
  public list Pget test(int id){
  llist list = client.get(getKey(id));
  if(list == null){ // 这里保证  加锁? 可以但是分布式环境肯定不行,只能用分布式锁?
  client.set(getListFromDB(id), time);
  }else{
  xx
  }
  }
  可以考虑用memcahe的add方法:但是所有倒要等待这个,如果时间稍长点就会对服务器造成想不到的压力, 如何做:可以想办法在过期前就更新,我们可以把对应的过期时间也保存起来没取一次判定是否更新
  具体情况具体分析吧:
  (redis也有这种情况)
  Redis:
  丰富的数据结构 string hash list set zset, 高效的内存,可以持久化
  缺点: 目前不支持服务端集群,3.0应该可以解决
  我们目前架构是接合redis 和mysql,redis开启了AOP昨晚对mysql的辅助,提高分布式锁,减少mysql压力
  ·1: 游戏的实时聊天
  2: 排行榜
  3:  标记,计数,开关
  4: 接合mysql分页
  5: 串行化,分布式锁,
  等
  在jedis层面再对redis进行一次分装,可以参考spring data redis设计,
  目前木有分片,也没怎么研究过,
  redis持久化: rdb和aof
  rdb快照的方式 ,通过save来配置;
  redis的事务和乐观锁
  乐观锁 watch
  事务  multi  exec; 事务不支持回滚,
  mysql实现乐观锁; 在表的字段加一个version版本号,更新的时候+1;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316128-1-1.html 上篇帖子: Redis 和 spring 的整合 下篇帖子: Redis:七、持久化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表