基础部分
- redis是一个缓存系统
- 存在于处理Model和Db之间读写过程之间
- 能够缓解甚至接管数据库的压力
- 存放常用或查询复杂的数据的数据(如何用户ID,权限等等,能不查数据库就不查,要注意和数据库的一致性)
优点:
- 操作具有原子性:保证了数据的可靠,错误操作会回滚,支持了竞争类业务的实现(类似于事务锁);
- 常驻内存:读写性能优越,远远高于硬盘IO;
- 支持多种数据格式:实现多种业务需求;
- 可以自动保存数据到硬盘,服务重启时恢复:服务稳定持久;
常见问题:
- 数据存不进去,内存达到最大配置 -> 修改配置文件的maxmemory参数
- 客户端连接失败 -> 检查防火墙,配置文件的bind参数
- 连接数过大 -> 检查是否增加配置,而非修改maxclients的参数
数据类型:
key – value型数据
set | 添加一个key-value键值对 | $redis->set('age',20); |
get | 获得该key的value值 | $age = $redis->get('age'); |
del | 删除该key-value | $redis->del('age'); |
exists | 键值是否存在,返回bool | $isAgeExist = $redis->exists('age'); |
setnx | 如果不存在则设置,返回bool | $res = $redis->setnx('age',20); |
- 键名一般按照从大到小来设计,以冒号风格,如libdata:citylist:1
- 常常在键名后面添加日期来进行使用,如统计每天的PV$key = ‘pv’.data()
hash型数据
hset | 用于为哈希表中的字段赋值 。 | $redis->hSet('zhangsan','age',20) |
hget | 返回哈希表中指定字段的值 | $age = $redis->hGet('zhangsan','age'); |
hdel | hdel | $redis->hDel('zhangsan','age'); |
hexists | 如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 | $isAgeExist = $redis->hExists('zhangsan','age'); |
hsetnx | 为哈希表中不存在的的字段赋值 | $res = $redis -> hSetNx('zhangsan','age','20'); |
- 缓存独立于数据库之外,并不是所有数据都接收延迟
- 要时刻注意数据的一致性
list型数据
lSet | 设置队列里面一个元素的值 | $res -> lSet('list',1,4); |
lLen | 获得队列(List)的长度 | $len = $redis->lLen('list'); |
lRange | 列表中获取指定返回的元素,注意,如0,3是0,1,2,3号元素都返回 | $arr = $redis->lRange('testlist', 0, 1); |
lTrim | 修剪到指定范围内的清单,使其只包含指定范围的元素 | $redis = lTrim |
lPush,rPush | 从左/右入列 | $redis->rPush('testlist',1); |
lPop,rPop | 从左/右出列 | $res = $redis->lPop('testlist') |
set型数据
sAdd | 将一个或多个 member 元素加入到集合 key 当中 | $redis -> sAdd('testset','a'); |
sMembers | 判断 member 元素是否集合 key 的成员。 | $arr = $redis->sMembers('testset'); |
sCard | 返回集合中元素的数量。 | $count = $redis -> sCard('testset'); |
sPop | 移除并返回集合中的一个随机元素。 | $rand = $redis->sPop('testset'); |
sDiff | 返回一个集合的全部成员,该集合是所有给定集合之间的差集。 | $arr = $redis -> isDiff('testset1', 'testset2') |
Reids实际应用
设计之前先确认一下是什么数据的结构,然后就可以开始设计,要注意数据的一致性,很多实用实用crontable来落盘数据。
天气的请求优化
- 把城市的天气缓存在redis中,每隔十分钟去请求一下接口把天气缓存住,这样就不用每个用户来的时候都去请求接口了。
- 可以吧redis的key放在一个常量的文件里面增加维护性
- 这里使用hash型数据
一般redis的连接使用单例模式:
实现逻辑:
PV的优化
如果是使用mysql的update那么要是同时有1000个用户访问就会出问题(没有事务锁的话)
然后每隔半小时crontable去落盘一次。
最感兴趣内容:
分类预览优化: