Redis

Redis之Redis事务

笑着哭i 提交于 2021-01-08 22:57:03
Redis事务的概念:   Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。   总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。   Redis事务没有隔离级别的概念:   批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。 Redis不保证原子性:   Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。 Redis事务的三个阶段: 开始事务 命令入队 执行事务 Redis事务相关命令:   watch key1 key2 ... : 监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断 ( 类似乐观锁 )   multi : 标记一个事务块的开始( queued )   exec : 执行所有事务块的命令 ( 一旦执行exec后,之前加的监控锁都会被取消掉 )    discard : 取消事务,放弃事务块中的所有命令   unwatch : 取消watch对所有key的监控 Redis事务使用案例: (1)正常执行 (2

蛋壳终于"退钱"了(附指南)

烂漫一生 提交于 2021-01-08 22:55:05
点击上方“ 民工哥技术之路 ”,选择“设为星标” 回复“ 1024 ”获取独家整理的学习资料! 蛋壳公寓爆雷的信息最近也是一直闹的沸沸扬扬的。租房者被房东赶出房子,房东换锁逼走房客,甚至到后面的有房客跳楼的事件发生,再到后面的“租金贷”的问题。 在蛋壳爆之前也有类似的事件发生: ,本身租客对长租公寓市场就缺少信心,加之蛋壳的爆雷,这让租客们仅存的一丝希望也随之破灭。 事件经过 尽管蛋壳公寓真正暴雷发生在今年年末,但在年初之时,蛋壳公寓已有“裂痕”出现,具体表现如下: 2 月初,蛋壳公寓由于“强制”房东们免租,却不给租户免租的消息,引发舆论质疑。 6 月 18 日,蛋壳公寓发布公告,称 CEO 高靖正在接受当地政府有关部门的调查,并宣布任命联合创始人、董事和总裁崔岩担任代理 CEO。 10 月 14 日,蛋壳公寓“破产跑路”的消息登上了微博热搜榜。当日晚些时候,蛋壳官方回应称,此乃部分合作方因纠纷而采取过激行为,散布虚假言论。 11 月 6 日,据中国执行信息公开网显示,蛋壳公寓关联公司紫梧桐(北京)资产管理有限公司又添 2 条被执行人信息,执行标的超 520 万元。 11 月 9 日,蛋壳公寓被央视曝光深陷流动性危机。 而后,事件愈演愈烈,蛋壳彻底“裂开”,房东、租户纷纷陷入困境,#租房女孩不得已持刀与房东对峙#、#广州蛋壳18楼租客坠楼# 陆续见于热搜之上。 最新进展

Spring Boot Cache使用与整合

浪尽此生 提交于 2021-01-08 20:15:07
Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Caffeine、Ehcache等),但本身不直接提供缓存功能的实现。它支持注解方式使用缓存,非常方便。 SpringBoot在annotation的层面实现了数据缓存的功能,基于Spring的AOP技术。所有的缓存配置只是在annotation层面配置,像声明式事务一样。 Spring定义了CacheManager和Cache接口统一不同的缓存技术。其中CacheManager是Spring提供的各种缓存技术的抽象接口。而Cache接口包含缓存的各种操作。 Cache接口下Spring提供了各种xxxCache的实现,如RedisCache,EhCacheCache ,ConcurrentMapCache等; 一,缓存技术类型与CacheManger 针对不同的缓存技术,需要实现不同的cacheManager,Spring定义了如下的cacheManger实现。 CacheManger 描述 SimpleCacheManager 使用简单的Collection来存储缓存,主要用于测试 ConcurrentMapCacheManager 使用ConcurrentMap作为缓存技术 (默认) ,需要显式的删除缓存,无过期机制 NoOpCacheManager 仅测试用途,不会实际存储缓存

搭建Redis集群

≡放荡痞女 提交于 2021-01-08 20:08:41
在上一篇我们已经介绍了Redis集群分区的规则,在这一篇我们开始上干货,真真正正的搭建一个Redis集群。搭建Redis集群主要分3步: 1.准备节点 2.节点握手 3.分配槽 下面我们分别介绍一下上面3个步骤的的详细使用。 准备节点 既然是搭建集群那么节点一定是多节点的,通常来说节点数量至少为6个才能保证高可用的集群。除此之外每个节点还需要配置cluster-enabled yes。由于每个节点的配置除了端口不同其它的配置均相同,所以我们已一个节点的配置为例,来介绍一个集群节点的配置。具体配置如下: # 节点端口 port 6379 # 开启集群模式 cluster-enabled yes # 节点超时时间,单位为毫秒 cluster-node-timeout 15000 # 集群内部配置文件 cluster-config-file "nodes-6379.conf" 下面我们启动6个节点: ./src/redis-server redis-6379.conf ./src/redis-server redis-6380.conf ./src/redis-server redis-6381.conf ./src/redis-server redis-6382.conf ./src/redis-server redis-6383.conf ./src/redis-server

Raft中的领导选取

时光怂恿深爱的人放手 提交于 2021-01-08 18:35:00
Raft 是一种用来管理日志复制的一致性算法。为了提高理解性,Raft 将一致性算法分为了几个部分,例如领导选取(leader selection),日志复制(log replication)和安全性(safety),同时它使用了更强的一致性来减少了必须需要考虑的状态。 本文我们主要介绍领导领导选取部分的内容。 备注:这里的一致性是强一致性。 1.服务器状态 每台服务器一定会处于三种状态: 领导者、 候选人、 追随者,如下图所示。 介绍如下: 追随者只响应其他服务器的请求。 如果追随者没有收到任何消息,它会成为一个候选人并且开始一次选举。 收到大多数服务器投票的候选人会成为新的领导人。 领导人在它们宕机之前会一直保持领导人的状态。 2.任期(Term) Raft 算法将时间划分成为任意不同长度的任期(term),任期用连续的数字进行表示。 每一个任期的开始都是一次选举(election),一个或多个候选人会试图成为领导人。如果一个候选人赢得了选举,它就会在该任期的剩余时间担任领导人。 在某些情况下,选票会被瓜分,有可能没有选出领导人,那么,将会开始另一个任期,并且立刻开始下一次选举。 Raft 算法保证在给定的一个任期最多只有一个领导人。 3.raft的leader选举过程 1)何时发起选举 集群开始时,所有服务器都是follower,当服务器在指定的时间之内没有收到

redis分布式加锁解锁

旧城冷巷雨未停 提交于 2021-01-08 18:29:54
public class RedisUtil { private static JedisPool jedisPool; private static final String LOCK_SUCCESS = "OK"; private static final String SET_IF_NOT_EXIST = "NX"; private static final String SET_WITH_EXPIRE_TIME = "PX"; private static final Long RELEASE_SUCCESS = 1L; public RedisUtil(JedisPoolConfig config) { if (jedisPool == null) { jedisPool = new JedisPool(config, "localhost", 6379, 2000); } } public RedisUtil(JedisPoolConfig config, String host, int port) { if (jedisPool == null) { jedisPool = new JedisPool(config, host, port, 2000); } } public RedisUtil(JedisPoolConfig config, String host

一次Task.Run异常问题的排查

↘锁芯ラ 提交于 2021-01-08 16:59:13
最近在测试一个功能代码时发现一个非常奇怪的问题,主要是Task.Run引起一些不符合逻辑的错误,以下针对这一问题排查的总结。 问题代码 可以建个控制台程序来运行以下代码 class Program { static User user = new User(); static void Main(string[] args) { for (int i = 0; i < 50; i++) { Task.Run(user.Init); } System.Threading.Thread.Sleep(-1); } } public class User { private bool mInit = false; private Task OnInit() { Console.WriteLine("User init"); System.Threading.Thread.Sleep(1000); return Task.CompletedTask; } public void Init() { lock (typeof(User)) { if (!mInit) { var task = Task.Run(this.OnInit); if (!task.Wait(5000)) { throw new TimeoutException("user init error!"); } mInit

简单介绍redis加锁常用几种方式

北城以北 提交于 2021-01-08 16:04:06
这篇文章主要介绍了浅谈redis加锁常用几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一、incr加锁 connect('127.0.0.1'); $redis->multi(); $redis->incr('number'); //$redis->decr('number'); //$redis->expire('number', -1); var_dump($redis->get('number')); var_dump($redis->ttl('number')); 二、setnx加锁 setnx('name', 'felix'); var_dump($redis->get('name')); var_dump($redis->ttl('name')); 三、set加锁 set('like', 'chuangxi', ['nx', 'ex' => 10]); //$redis->del('like'); var_dump($redis->get('like')); var_dump($redis->ttl('like')); 四、防止死锁 set('like', 'a', ['nx', 'ex' => 10]); if($isLock) { if($redis->get('like') ==

开发运维视角下,影响软件高可扩展性的6个因素

落花浮王杯 提交于 2021-01-08 11:41:52
<section id="nice" data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="font-size: 16px; color: black; padding: 0 10px; line-height: 1.6; word-spacing: 0px; letter-spacing: 0px; word-break: break-word; word-wrap: break-word; text-align: left; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;"><p data-tool="mdnice编辑器" style="font-size: 16px; padding-top: 8px; padding-bottom: 8px; margin: 0; line-height: 26px; color: black;">软件可扩展性是一个有趣的话题。实现软件可扩展性涉及很多因素,我们在本文将讨论一些与开发和运维方面相关的因素。</p> <p