引言
先罗列一下缓存的基本概念。
所有类型的缓存:
- L1 L2: CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多
- DB cache(mysql query cache)
- Brower
- CDN
- Mobile image cache
那些数据适合缓存:
- 热点数据:top10,秒杀
- 中间结果:比如哨兵的报警表达式触发次数,这次次数需要累计起来,存入数据库似乎没有意义
- 预计算结果:计数、总量、max avg等统计结果。
常用的缓存框架
- Ehcache: “JAVA’S MOST WIDELY-USED CACHE”,rmi协议支持jvm间数据同步问题
- Spring cache :spring 给出的 缓存抽象,不是具体实现
这些都属于本地缓存,Ehcache可以满足JVM间数据同步的问题。具体实现可以用spring cache + echcache
常用的缓存数据库
- Map,虽然听起来有点土,但是属于程序猿做本地缓存的一种办法
- Redis
- MemCached
那么离不开这两者的比较:
Redis vs MemCached
item | Redis | MemCached |
---|---|---|
高可用 | 支持 | 自己实现 |
持久化 | 支持 | 不支持 |
数据类型 | 5种类型 | String类型 |
线程 | 单线程 | 多线程 |
事务 | 支持 | 使用CAS命令支持 |
还有以下特点:
- Both fast enough
- Memcached is suitable for small and static data
- Redis is preferable for structured data
- Data can be persisted in Redis
- If only one can be choosed, Redis is a better choice ^_^
Redis属于缓存数据库
应用
- 业务层缓存 (spring cache)
- 持久层缓存 (Mybatis的二级缓存)
- 数据层缓存 (eg:mysql query cache)
架构
- 本地缓存 Map Ehcache
- 分布式缓存 JBossCache
- 集中式缓存 memcached redis
Redis安装及配置文件,及启动
安装的话就不用赘述了,从官方下一个tar包,比如http://download.redis.io/releases/redis-2.8.24.tar.gz
解压make,make install即可
Redis.conf
基本配置
- pidfile 记录redis-server的pid文件路径
- port Redis-server的监听端口
- daemonize Redis-server配置成守护进程
- loglevel Redis-server的日志级别(warning, notice,verbose,debug)
- logfile 日志文件路径
- requirepass 密码
- maxmemory Redis能使用的最大内存量
- maxmemory-policy 内存用完后的置换策略
- volatile-lru:设置了过期时间的key中,删除最近最少用的key
- allkeys-lru:所有的key中,删除最近最少用的key
- noeviction:不置换,直接返回OOM错误
- 其他。
- databases 与mysql类似,一个redis实例中可以分多个库
- 相同的库key是唯一的,不同的库key可以复用
- 此配置项配置redis中库的个数
还有一些其他比如持久化和高可用的配置,另外一篇进阶篇会介绍。
更详细的文档,请参考官方:详细配置
服务器端启动:
客户端访问:
Redis常用数据类型
String类型
格式:“key” : “value”
常用命令:
- set key value
- get key
- del key
- incr/decr key
- setex key seconds value
List
格式:类似于JAVA的List类型,”key”:[“value1”,”value2”]
常用命令:
- lpush key value1 value2 …
- lrange key start end
- lrem count value
- lindex key index
- llen key
Hash
格式:类似于Java中的Map类型,”key”:{“field1”:”value1”, “field2”:value2,…}
常用命令:
- hset key field value
- hget key field
- hdel key field1 field2…
- hkeys key
- hvals key
Set
格式:类似于Java中的set类型。”key”:{“member1”,”member2”,…}
常用命令:
- sadd key member1 member2 …
- srem key member1 member2 …
- smembers
- scard key
- sinter key1 key2
- sunion key1 key2
Sorted Set
格式: “key”: {(“score1”,”memeber1”, (“score2”,”memeber2”)…)
常用命令:
- zadd key score member
- zrem key member
- zrangebyscore key min max (withscores)
- zcard key
其他常用命令
- Keys + 匹配条件: keys * : 返回所有key
- expire key seconds: 设置key的过期时间
- ttl key: 查询key的过期时间
- type key: 查询key的类型
- exists key: 检查key是否存在
- Publish/subcribe:
- 发布一个推送频道以及订阅一个推送频道
- 推送端和接收端均连上同一个redis
- Subscribe + channel1 + channel2
- Publish channel1 “hello world”
- 类似于MQ
- Multi/exec/discard
- 事务
- 要么全成功,要么全回滚
常用的客户端
Linux
Redis-cli:安装后自带
Windows
支持的编程语言
JAVA
Jedis
Python
pip install redis
|
|
其他
- Ruby:Redis-rb
- PHP: phpredis
- C++:hiredis.h