当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么?
举一些场景:
一、比如实现一个简单的日志收集功能或发送大量短信、邮件的功能,实现方式是先将数据收集到队列中,然后有一个定时任务去消耗队列,处理该做的事情。
直接使用 Redis 的 lpush,rpop 或 rpush,lpop。
//进队列
$redis->lpush(key, value);
//出队列
$redis->rpop(key);
Memcached 没有这种数据结构。
二、比如我们要存储用户信息,ID、姓名、电话、年龄、身高 ,怎么存储?
方案一:key => value
key = user_data_用户ID
value = json_encode(用户数据)
查询时,先取出key,然后进行json_decode解析。
方案二:hash
key = user_data_用户ID
hashKey = 姓名,value = xx
hashKey = 电话,value = xx
hashKey = 年龄,value = xx
hashKey = 身高,value = xx
查询时,取出key即可。
//新增
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
//编辑
$redis->hSet(key, hashKey, value);
//查询
$redis->hGetAll(key); //查询所有属性
$redis->hGet(key, hashKey); //查询某个属性
方案二 优于 方案一。
三、比如社交项目类似于新浪微博,个人中心的关注列表和粉丝列表,双向关注列表,还有热门微博,还有消息订阅 等等。
以上都用 Redis 提供的相关数据结构即可。
四、Memcached 只存储在内存中,而 Redis 既可以存储在内存中,也可以持久化到磁盘上。
如果需求中的数据需要持久化,请选择 Redis 。
个人在工作中没有用到 Memcached ,通过查询资料得到 Memcached 内存分配时优于 Redis。
Memcached 默认使用 Slab Allocation 机制管理内存,按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。
如何保证,缓存与数据库的数据一致性?
新增数据:先新增到数据库,再新增到缓存。
编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。
删除数据:先删除缓存数据,再删除数据库中数据。
查询数据:先查询缓存数据,没有,再查询数据库,再新增到缓存。
强一致性是很难保证的,比如事务一致性,时间点一致性,最终一致性等。
当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么?的更多相关文章
- node-express脚手架生成的项目中实现浏览器缓存
前言: 最近在做基于 node-express 的个人站点 朵朵视野 ,在站点发布之后自己在访问测试的过程中发现站点是没有缓存机制的,这样就导致每次访问站点都需要重新去加载资源,很消耗资源以及用户体验 ...
- java项目中,针对缓存问题的处理方式【接口中的处理方式】
1.在service包中,分别建立了关于缓存的一系列的接口.类等,封装到一个工具包中: 临时缓存的接口(代码部分): package com.tools; import java.util.Date; ...
- 分布式缓存技术PK:选择Redis还是Memcached?
作者:田京昆(腾讯后台研发工程师) 来源:腾云阁(https://www.qcloud.com/community/article/129) Memcached和Redis,作为近些年最常用的缓存服务 ...
- vue项目中禁用浏览器缓存配置案例
项目发布新版本,部署线上后用户浏览器需要清理缓存 1.public文件夹中修改 index.html文件meta配置 <meta http-equiv="Cache-Control&q ...
- 缓存技术比拼:Redis与Memcached的同与不同
转至:http://developer.51cto.com/art/201603/507980.htm 在今天的文章中,我们将探讨Redis(REmote DIctionary Server).Red ...
- 在.NET项目中使用PostSharp,使用CacheManager实现多种缓存框架的处理
在前面几篇随笔中,介绍了PostSharp的使用,以及整合MemoryCache,<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>.<在.NET项目中使用Pos ...
- Django 项目中设置缓存
一.配置文件settings.py中 # 设置django缓存存放位置为redis数据库,并设置一个默认(default)选项,在redis中(配置文件/etc/redis/redis.conf)开启 ...
- Maven项目中的run as选项介绍
maven install:把本项目发布到本地资源库maven package:编译.测试,然后打包项目maven test:执行测试maven clean:把该资源从本地资源库清除.在基于Maven ...
- C#开发微信门户及应用(48) - 在微信框架中整合CacheManager 缓存框架
在我们的很多框架或者项目应用中,缓存在一定程度上可以提高程序的响应速度,以及减轻服务器的承载压力,因此在一些地方我们都考虑引入缓存模块,这篇随笔介绍使用开源缓存框架CacheManager来实现数据的 ...
- 分布式二级缓存组件实战(Redis+Caffeine实现)
前言 在生产中已有实践,本组件仅做个人学习交流分享使用.github:https://github.com/axinSoochow/redis-caffeine-cache-starter 个人水平有 ...
随机推荐
- 你知道 Java 有哪些引用吗?
前言 判断对象是否要回收有引用计数法和可达性算法两种方式,无论哪种都离不开引用,本文将介绍Java的四种引用. 一.概述 二.详解 1. 强引用 概述 在Java程序中,强引用是最常见的也是默认的.n ...
- kubernetes 之 Rolling Update 滚动升级
滚动升级 1.错误的yml文件 [machangwei@mcwk8s-master ~]$ cat mcwHttpd.yml apiVersion: apps/v1 kind: Deployment ...
- Java静态变量在静态方法内部无法改变值
一.如何解决"Java静态变量在静态方法内部无法改变值"的问题 在Java中,静态变量(也称为类变量)属于类本身,而不是类的任何特定实例.它们可以在没有创建类的实例的情况下访问和修 ...
- MyBatis抛出BindingException异常可能是你忘了配置资源拷贝
最近博主在搭建Mybatis项目时遇到了一问题,在一切配置妥当后,开始运行测试代码,但是此时控制台无情的抛出了异常: 开始寻找问题根源 咦?难道是我哪里写错,我的第一反应是我的xml配置文件哪里写错了 ...
- Flutter(九)Json序列化与反序列化(转Model)
在日常开发中JSON的序列化与反序列化是一个常见的操作:而Dart语言不支持反射,运行时反射会影响Dart的tree shaking(摇树优化),tree shaking可以"抖掉" ...
- 『手撕Vue-CLI』拉取版本号
开篇 在上一篇文章中,给 nue-cli 添加了与用户终端交互的功能,这一次来实现一个拉取版本号的功能. 这个功能的背景是,有时候我们在使用脚手架的时候,不同版本的脚手架可能会有不同的功能,所以用户有 ...
- zabbix笔记_007 zabbix 分布式架构
1. zabbix 分布式架构[服务器数量较大的场景下使用] 现有架构: agent --> zabbix server proxy架构: agent --> zabbix proxy - ...
- uniapp 返回顶部
<template> <view> <view class="btn" @tap="toTop" :style="{'d ...
- Lru在Rust中的实现, 源码解析
LRU(Least Recently Used)是一种常用的页面置换算法,其核心思想是选择最近最久未使用的页面予以淘汰. LRU算法原理 基本思想:LRU算法基于一个假设,即如果一个数据在最近一段时间 ...
- 自定义动画 jquery的结束动画
<button name="width">改变宽</button> <button name="height"> ...