tyltr技术窝

1. 分布式锁#

redis可以实现分布式锁。当然用redis实现分布式锁还是比较初级的,可以使用zookeeper,etcd实现。

redis实现分布式锁是基于下面的命令。

1
2
set key value EX seconds NX
# 如果key不存在,设置key value,过期时间为seconds

例如:

1
set name tyltr ex 100  nx

解析:分部署环境中,多台机器可以实现一旦加锁就不能获取了。过期时间的设置是为了保证这key是可以过期的。
如果没有过期时间,那么如果一个机器获取到分布式锁之后挂掉了。那么这个锁永远不会被释放了,
所以加上过期时间以保证即便是分布式锁没有被主动释放,这个key最终会过期。

但是redis的分布式锁绝对不能使用下面的命令实现。

1
2
setnx key value
expire key seconds

为什么呢?
因为第二种,不能保证整体的原子性了。在第二种中,如果一个机器仅仅执行了 setnx key value就挂掉了,
那么这个key就永远不会过期。也就意味着其他的机器永远获取不到锁。

2.计数器#

在博客、微博等文章的被阅读量等的统计是可以使用redis实现的,而不是直接写入数据库。然后再定期写入数据库。

计数器是基于redis的incr实现的。

1
incr key

例如:

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> get tyltr
(nil)
127.0.0.1:6379> incr tyltr
(integer) 1
127.0.0.1:6379> get tyltr
"1"
127.0.0.1:6379> incr tyltr
(integer) 2
127.0.0.1:6379> get tyltr
"2"

这种异步写入数据库的方式,减轻了数据库的压力。但是虽然redis有持久化的机制。
但是仍然会出现数据丢失的可能性,但是对于阅读量、点赞量等非核心业务的计数器,即使少统计了几次,也无关紧要。

3.实现简单的搜索#

一些基本的文件文本搜索的时候,没必要使用ES的情况下,不妨试试redis。

搜索的基本原理是反向索引。redis的集合是很适合做反向索引的。

场景:博文redis缓存与mysql数据库的数据一致性解决方案
坑人的null
两篇文章的关键字分别是(redis、缓存、Mysql、数据一致性)、(Mysql 、数据库允许空值、or、全表扫描),

那么使用关键字redis进行搜索,需要获取博文redis缓存与mysql数据库的数据一致性解决方案
使用关键字Mysql进行搜索,则获取到redis缓存与mysql数据库的数据一致性解决方案
坑人的null两篇文章。

将关键字与文章之间进行反向索引。

1
2
3
4
5
127.0.0.1:6379> sadd redis "redis缓存与mysql数据库的数据一致性解决方案"
(integer) 1
127.0.0.1:6379> sadd mysql "redis缓存与mysql数据库的数据一致性解决方案"
(integer) 1
127.0.0.1:6379> sadd mysql "坑人的null"

在查询关键字MySQL的文章时,执行SMEMBERS mysql即可获取所有的关键字是mysql的文章