1. 分布式锁#
redis可以实现分布式锁。当然用redis实现分布式锁还是比较初级的,可以使用zookeeper,etcd实现。
redis实现分布式锁是基于下面的命令。
1 | set key value EX seconds NX |
例如:
1 | set name tyltr ex 100 nx |
解析:分部署环境中,多台机器可以实现一旦加锁就不能获取了。过期时间的设置是为了保证这key是可以过期的。
如果没有过期时间,那么如果一个机器获取到分布式锁之后挂掉了。那么这个锁永远不会被释放了,
所以加上过期时间以保证即便是分布式锁没有被主动释放,这个key最终会过期。
但是redis的分布式锁绝对不能使用下面的命令实现。
1 | setnx key value |
为什么呢?
因为第二种,不能保证整体的原子性了。在第二种中,如果一个机器仅仅执行了 setnx key value
就挂掉了,
那么这个key就永远不会过期。也就意味着其他的机器永远获取不到锁。
2.计数器#
在博客、微博等文章的被阅读量等的统计是可以使用redis实现的,而不是直接写入数据库。然后再定期写入数据库。
计数器是基于redis的incr实现的。
1 | incr key |
例如:
1 | 127.0.0.1:6379> get tyltr |
这种异步写入数据库的方式,减轻了数据库的压力。但是虽然redis有持久化的机制。
但是仍然会出现数据丢失的可能性,但是对于阅读量、点赞量等非核心业务的计数器,即使少统计了几次,也无关紧要。
3.实现简单的搜索#
一些基本的文件文本搜索的时候,没必要使用ES的情况下,不妨试试redis。
搜索的基本原理是反向索引。redis的集合是很适合做反向索引的。
场景:博文redis缓存与mysql数据库的数据一致性解决方案和
坑人的null
两篇文章的关键字分别是(redis、缓存、Mysql、数据一致性)、(Mysql 、数据库允许空值、or、全表扫描),
那么使用关键字redis
进行搜索,需要获取博文redis缓存与mysql数据库的数据一致性解决方案,
使用关键字Mysql
进行搜索,则获取到redis缓存与mysql数据库的数据一致性解决方案和
坑人的null两篇文章。
将关键字与文章之间进行反向索引。
1 | 127.0.0.1:6379> sadd redis "redis缓存与mysql数据库的数据一致性解决方案" |
在查询关键字MySQL
的文章时,执行SMEMBERS mysql
即可获取所有的关键字是mysql
的文章