1.我在项目中使用redis不会缓存对象,而是存;因为频繁的序列化和反序列化会占用cpu,所以我们;
2.KEY的设计就是字符串拼接的形式:;比如[user]::[id]::[act];
3.redis缓存服务器笔记;redis是一个高性能的key-value存储系;但是由于他是一个内存内存系统,这些数据还是要存储;
4.作为缓存框架:;create/updae
因为频繁的序列化和反序列化会占用cpu,所以我们这样使用可以降低redis服务对CPU的要求。一般部署redis的主机都是内存比较空闲的主机,而把解析json这部分工作移到应用内部,应用所在主机的CPU配置必然是高的。这样可以有效的利用主机资源。1. 我在项目中使用redis不会缓存对象,而是存储jso(Google Protocol Buffer)字符串。
2. KEY的设计就是字符串拼接的形式:
比如[user]::[id]::[act]。
3.
redis缓存服务器笔记
redis是一个高性能的key-value存储系统,能够作为缓存框架和队列
但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的
4. 作为缓存框架:
create/updae/delete---同时存到redis和数据库
query--先从redis查,没有记录才从数据库查,并把从数据库查的结果也放一份到redis
5. 作为缓存队列:
把对象Object存储到redis中,怎么存?memcache存取对象是序列化和反序列化 使用通用的序列化、反序列化(频繁的会很消耗cpu,使用Google Protocol Buffer,将对象打成二进制流)或者使用json存储(阿里巴巴的fast-json)
6. java使用redis的客户端一般是:jedis
jedis的原生接口只支持基本数据类型和String、byte[]
7. 我对redis队列的理解:
重要的数据:先存到数据库,然后存到redis
要求响应速度很高的的数据:先写缓存,然后通过消息队列再写入数据库
因为Redis的value支持String、list、set、zset
那么就可以把redis的list当作队列来用
入队:lpush mylist 'hello1'
出队:lpop mylist
8. 其提供AOF(追加式操作记录文件)和DUMP(定期数据备份)两种持久化方式
9. VM(虚拟内存机制):如果有1万条数据保存到内存中,那么我就要配置能存储这么多
数据的内存然后这1万条数据有9000条不是活跃数据,那就白白浪费了,可以这样做,当数据容量超过内存时,将部分value存储到文件中memcached是把数据完全存储
到内存中,而redis是大部分的,因为他支持自定义的VM同时Redis支持主从复制机制
10. 数据库缓存
Redis提供了较为丰富数据类型,使我们可以更为容易地将数据对象缓存起来(序列化、protobuffer)。
当需要请求某一数据时,先从Redis中查找,如果没有再查数据库,同时交给Redis缓存起来。
当对数据进行修改时,则先将修改后的数据保存到Redis,然后保存至数据库(2)。 第2步可以有另外的思路:
A不实时保存到数据库,而是交由另外的线程(甚至是专门的程序)去保存,以提高逻辑层的响应速度。
B部分数据交给Redis保存(Reids自身有持久化功能),像玩家已经完成过的任务ID集合,利用Redis的Set类型保存更为合适。
C玩家瞬时变化的数据不见得每次修改都需要保存(比如金钱、经验),但如果游戏服务器自己维护在内存中,出现宕机就会导致回档。
Redis是独立于游戏服务器的,交由它来保存,可以防止宕机回档的问题,也可以减少游戏服务器自己维护数据所占用的内存。 11. 三、缓存更新规则
时间过期+规则过期: 上面基于时间过期的更新策略,在过期时间内,将一直从缓存读取数据;在过期
之后,则需要重新从数据库加载数据到缓存。这种策略的问题是大并发访问时,容易造成数据库瞬间高并发读。解决的办法是添加“基于规则过期”的更新策略。
添加规则过期的策略之后,当从缓存拿到数据后,首先检查该数据离设定的过期时间是否小于一定的值,如果小于一定值,则读取数据库更新缓存,进行提前更新,从一定程度上避免了大并发访问时,数据库瞬间高并发读;当从缓存读取不到数据时,从数据库读取,并更新缓存。 以上更新策略,在缓存数据过期后才读取的时候,仍有可能造成数据库瞬间高并发读。
12.应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql。
同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis
主键。
这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发。
13.
1 Mysql更新Redis
Mysql更新Redis借鉴memcache与mysql通信,利用mysql udf,每有更新操作触发更新redis操作。不足在高并发时mysql压力较大,且针对每张表均需增删改触发,且Redis服务器不好更换(不知道有没有方法)。
2 Redis更新Mysql
最简单的就是读redis->写mysql.但是在高并发下,这样就不太适合了,因此考虑利用消息队列每隔的固定时间更新Mysql。
但是数据中主键为自增时,目前想法如下:
第一,Redis采用tempId为key,id为空,通过mysql udf重写数据到缓存如 ,清空缓存临时数据。
第二,redis key值不采用Id,采用字段uuid,再通过mysql udf 同步redis缓存 id。 第三,Redis读取Mysql表最新自增键Id值,Redis传递id。
Redis更新Mysql需注意,Redis在系统中的定位,作缓存服务器时,需规划存储哪些数据,保存多长时间等等。