redis【REMOTE Dictionary Server】是一种开源的内存数据库,可以用作关键值数据库、缓存库以及消息中间件。在使用Redis作为关键值数据库时,需要利用它实现分布式锁,以解决多线程间的竞争。本文将介绍如何利用Redis实现分布式的分布式锁。
了解Redis分布式锁的原理。Redis分布式锁的基本思想是将锁封装成Redis中的一个key-value键值对,线程在获取锁的时候就是去Redis 服务器 上尝试获取一个特定key的值,如果获取到则表示获取锁成功,反之则表示获取锁失败。为了防止获取失败的线程再次尝试获取锁而产生竞争,Redis分布式锁还会设置生存时间,只有第一个获取到锁的线程才能设置锁的生存时间,其他线程尝试获取锁失败,但后续线程会在上一次获取成功的线程生存时间到期后重新尝试获取锁,因此能确保锁在整个分布式系统中可以正确的释放。
实现Redis分布式的锁需要实现以下几步:

1、使用SETNX命令在Redis中创建一个key-value键值对。
2、用EXPIRE命令来设置key的过期时间。
3、使用GET命令获取key的值,如果值为null,则表示上锁失败,反之表示上锁成功。
4、当线程完成任务后,调用DEL命令来释放锁。
下面是一个样例实现:
//获取锁public boolean tryLock(String key, String keyId, long expireTime) {String result = jedis.set("lock_" + key, keyId, "NX", "PX", expireTime);if (result.equals("OK"))return true;return false;}//释放锁public boolean unlock(String key, String keyId) {String val = jedis.get("lock_" + key);if (val != null && val.equals(keyId)) {jedis.del("lock_" + key);return true;}return false;}
Redis分布式锁具有很强的实时性,可以有效解决多线程竞争的问题,但是也存在一些问题,比如程序死锁、死锁解除机制等,为避免出现以上问题,应使用正确的数据结构进行实现,并正确处理程序中可能出现的异常,以确保统一解锁。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
访问redis不需要用户名密码吗
如果设置了用户名跟密码 那肯定是要的。没设置 通常 admin 不行的话 就需要重新设置了或者找回
scrapy使用redis的时候,redis需要进行一些设置吗
1.使用两台机器,一台是win10,一台是CentOS7,分别在两台机器上部署scrapy来进行分布式抓取一个网站7的ip地址为192.168.1.112,用来作为redis的master端,win10的机器作为的爬虫运行时会把提取到的url封装成Request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis5.重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的!
java web怎样用redis做角色权限菜单控制
redis只是一个缓存而已,具体实现还是得靠数据库+拦截器等,数据库中定义角色、权限、用户等表,拦截请求后判断用户角色是否拥有权限。 权限的范畴比较广,可以是请求路径,可以是用户角色等。 你可以把一些权限信息预加载到redis!
发表评论