并发访问
Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:
1.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
2.服务器角度,利用setnx实现锁。如某客户端要获得一个名字list的锁,客户端使用下面的命令进行获取:
Setnx lock.list current time + lock timeout
- 如返回1,则该客户端获得锁,把lock. list的键值设置为时间值表示该键已被锁定,该客户端最后可以通过DEL lock.list来释放该锁。
- 如返回0,表明该锁已被其他客户端取得,等对方完成或等待锁超时。
3.线程池
mysql通信
数据一致性主要针对系统中Redis与mysql中的数据而言。为保证二者数据一致可采用以下策略:对于重要的数据,系统可以采取先写数据库再写缓存的方式来保证,而对于一般而响应速度要求很高的数据可以采取先写缓存然后通过消息队列再写入数据库的方式,同时做好错误日志记录以及能根据日志恢复数据。(jms/Redis消息队列)
存在问题:
(1)当用户进行添加操作, Redis与Mysql如何同步?
首先服务器启动,Redis读取Mysql表最新自增键Id值,然后Redis 读取id并封装缓存,同时保持mysql最后由队列完成mysql更新
(2)消息队列处理?
定位Redis操作:
定位dao:定义类、方法对应规则,结合存储Redis key定位方法,更新mysql
分类处理:按照类、方法。