Redis

使用Redis实现分布式锁

丶灬走出姿态 提交于 2020-08-14 02:37:12
一.介绍   分布式锁,或者称为“全局锁”,在分布式环境中,保证锁只能被一个对象(或者成为“事务”)获取,经常出现在“避免数据重复处理”、“接口幂等”的场景。   下面介绍了Redis中两种分布式锁的实现方式。    二.setnx + expire组合 2.1命令介绍   使用setnx和expire命令组合实现,这两个命令用法如下: setnx key value expire key seconds   对于setnx来说,只有key不存在,或者已经过期,setnx才会成功(返回1),否则失败(返回0)。   expire可以用来对key的有效期进行设置,若不设置key的有效期,则默认为-1,表示一直有效; 2.2操作步骤   实现分布式锁的时候,方式很简单: 2.现有A、B两个线程尝试获取同一个全局锁,假设先接收到A的请求; 3.直接执行setnx命令,key为foo,value可以根据业务制定,比如A的名称或者某个特殊的值; 4.如果setnx加锁成功,那么使用expire去设置key的过期时间,防止一直不释放锁的情况出现; 5.加锁成功后,且设置过期时间成功后,执行自己的业务逻辑(获取到全局锁的逻辑),等待 锁自动过期释放 或者 手动删除(del命令) ; 6.如果setnx加锁失败,则根据自己业务逻辑进行其他操作(未获取到全局锁的逻辑)。 2.3释放锁存在的问题  

【原创】强撸基于 .NET 的 Redis Cluster 集群访问组件

|▌冷眼眸甩不掉的悲伤 提交于 2020-08-14 01:56:12
  Hello 大家好,我是TANZAME,我们又见面了。今天我们来聊聊怎么手撸一个 Redis Cluster 集群客户端,纯手工有干货,您细品。   随着业务增长,线上环境的QPS暴增,自然而然将当前的单机 Redis 切换到群集模式。燃鹅,我们悲剧地发现,ServiceStack.Redis这个官方推荐的 .NET 客户端并没有支持集群模式。一通度娘翻墙无果后,决定自己强撸一个基于ServiceStack.Redis的Redis集群访问组件。   话不多说,先上运行效果图:   Redis-Cluster集群使用 hash slot 算法对每个key计算CRC16值,然后对16383取模,可以获取key对应的 hash slot。Redis-Cluster中每个master都会持有部分 slot,在访问key时根据计算出来的hash slot去找到具体的master节点,再由当前找到的节点去执行具体的 Redis 命令(具体可查阅 官方说明文档 )。   由于 ServiceStack.Redis已经实现了单个实例的Redis命令,因此我们可以将即将要实现的 Redis 集群客户端当做一个代理,它只负责计算 key 落在哪一个具体节点(寻址)然后将Redis命令转发给对应的节点执行即可。   ServiceStack.Redis的RedisClient是非线程安全的

超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!

元气小坏坏 提交于 2020-08-14 01:53:28
​ 之前写过很多次关于Java学习指南、Java技术路线图的文章。但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃。 于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来,做成一份非常硬核的Java学习指南+路线图,一篇文章搞定Java学习,360度无死角(可能)如果你们喜欢这类硬核的文章,以后我也会继续这么硬核下去的!不要忘了分享噢。 以下就是本文的主要内容,万字长文,你可悠着点看,拒绝到收藏夹吃灰! 一、Java学习路线图 1 计算机基础 **2 ** Java编程 Java基础 设计模式 Java Web技术 Java并发技术 Java网络编程和服务器 Jvm基础与调优 3 Linux 4 数据相关 关系数据库Mysql 缓存 搜索引擎 大数据 5 算法和数据结构 6 分布式 大型网站架构 分布式理论 一致性问题 分布式session 分布式缓存 分布式数据库 负载均衡 消息队列 服务化 虚拟化 二、硬核Java学习资源清单 Java入门学习资源 Java后端技术专栏 Java工程师书单 技术社区推荐 技术大牛推荐 三、硬核Java实战项目清单 标星10w+ 超级硬核的技术面试指南 硬核Java工程师面试指南 硬核开源,标星30k的硬核电商实战项目 技术博主【纯洁的微笑】springboot和springcloud入门demo

数据库开发规约

心不动则不痛 提交于 2020-08-14 01:45:08
目录 Redis 开发规范 一、键值设计 1. key名设计 2. value设计 3.【推荐】:控制key的生命周期,redis不是垃圾桶。 二、命令使用 1.【推荐】 O(N)命令关注N的数量 2.【推荐】:禁用命令 3.【推荐】合理使用select 4.【推荐】使用批量操作提高效率 5.【建议】Redis事务功能较弱,不建议过多使用 6.【建议】Redis集群版本在使用Lua上有特殊要求: 7.【建议】必要情况下使用monitor命令时,要注意不要长时间使用。 三、客户端使用 四、相关工具 1.【推荐】:数据同步 2.【推荐】:big key搜索 3.【推荐】:热点key寻找(内部实现使用monitor,所以建议短时间使用) 五 附录:删除bigkey 1. Hash删除: hscan + hdel 2. List删除: ltrim 3. Set删除: sscan + srem 4. SortedSet删除: zscan + zrem PostgreSQL开发规约 0x00背景 0x01 命名规范 0x02 设计规范 0x03 索引规范 0x04 查询规范 本文转载自 https://mp.weixin.qq.com/s/wHejs76INaxDYPuFmZ6b0w https://mp.weixin.qq.com/s/b69JF9Nh8dZBzep9RtRrfQ 如有侵权

Redis学习笔记(四)--安全

别等时光非礼了梦想. 提交于 2020-08-14 01:42:30
Redis学习笔记(四)--安全 基于Redis6之前版本 一、设置数据库密码 1、配置文件“redis.conf”修改,需重启服务器 在配置文件中“redis.conf”设置"requirepass 123456" 2、通过"config get requirepass"命令修改,无须重启服务器 redis 127.0.0.1:6379> config set requirepass 123456 redis 127.0.0.1:6379> config get requirepass "123456" 设置完成后,登录时需通过“-a”提供密码进行登录 # ./redis-cli -h 127.0.0.1 -p 6379 -a 123456 或者先登录再通过"AUTH"命令进行权限验证 # ./redis-cli -h 127.0.0.1 -p 6379 redis 127.0.0.1:6379> AUTH 123456 二、重命名非安全命令 1、通过配置文件"redis.conf"修改,也可彻底禁用非安全命令,需重启服务器 # 彻底禁用危险命令 rename-command KEYS "" rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command CONFIG "" # 重命名危险命令 rename

Redis:Creating Server TCP listening socket *:6379: bind: No such file or directory解决方案

烂漫一生 提交于 2020-08-14 01:23:05
使用redis-server启用redis服务器出现以下问题的解决方法 解决方法: 对于[8348] # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf错误 意思是没有默认的conf文件 解决方法: 切换到redis对应的目录,把命令改成: redis - server . exe redis . windows . conf 再次重新启动即可。 启动后发现[8348] # Creating Server TCP listening socket *:6379: bind: No such file or directory问题依然存在,可按以下方法解决 解决方法: 在cmd中依次输入以下指令: redis - cli . exe 127 . 0 . 0 . 1:6379>shutdown ( error ) NOAUTH Authentication required 127 . 0 . 0 . 1:6379>AUTH 123456 OK 127 . 0 . 0 . 1:6379>shutdown not connected> exit redis - server

如何成为一名合格的 C/C++ 开发者?

谁说我不能喝 提交于 2020-08-14 01:19:51
我是张小方,公众号「高性能服务器开发」,前携程旅行网技术专家组专家,擅长高性能服务器的开发! 文章会收录在 【高性能服务器开发】公众号,这是一个实实在在帮助开发者提高的技术号。 写在前面的话 在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃。 笔者从学生时代开始接触 C/C++,工作以后先后担任过 C++ 客户端和服务器的开发经理并带队开发,至今已经有十多年了。虽然时至今日哪种编程语言对我来说已经不再重要(我目前主要从事 Java 开发),但 C/C++ 仍然是笔者最喜欢的编程语言。在我看来,C/C++ 一旦学成,其妙无穷,就像武侠小说中的“九阳神功”一样,有了这个基础,您可以快速学习任何语言和编程技术。 C/C++ 的当前应用领域 需要注意的是本文不细分 C 与 C++ 的区别,通常情况下,C++ 可以看成是 C 的一个超集,在古典时期,可以认为 C++ 就是 C with classes 。虽然如今的 C++ 从功能层面上来看,离 C 越来越远了;但是从语法层面来上来看,大多数 C++ 语法还是与 C 基本一致的——所谓 C++ 的面向对象特性,如果细究 C++ 类方法的具体语法还是 C 的过程式语法。当然,面向对象是一种思想,语言本身对其支持的程度固然重要,能否熟练使用更要看开发者的水平。 C

Redis凭啥这么快?只能做缓存?架构师道出了真相(颠覆你的认知)

纵然是瞬间 提交于 2020-08-14 00:32:18
Redis到底有多快 Redis采用的是基于内存的采用的是 单进程单线程 模型的 KV 数据库 , 由C语言编写 ,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!有兴趣的可以参考官方的基准程序测试《 How fast is Redis? 》( redis.io/topics/benchma ) 横轴是连接数,纵轴是QPS 。此时,这张图反映了一个数量级,希望大家在面试的时候可以正确的描述出来,不要问你的时候,你回答的数量级相差甚远! Redis为什么这么快 1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1); 2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的; 3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; 4、使用多路I/O复用模型,非阻塞IO; 5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话

一次依赖注入不慎引发的一连串事故

半腔热情 提交于 2020-08-13 18:44:40
一次依赖注入不慎引发的一连串事故 起因和现象 偶尔会看到线上服务启动的时候第一波流量进来之后, 迟迟没有任何的响应,同时服务的监控检查接口正常, 所以 K8S 集群认为服务正常,继续放入流量。 查看日志基本如下: [2020-06-05T13:00:30.7080743+00:00 Microsoft.AspNetCore.Hosting.Diagnostics INF] Request starting HTTP/1.0 GET http://172.16.2.52/v1/user/test [2020-06-05T13:00:30.7081525+00:00 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware DBG] The request path /v1/user/test/account-balance does not match a supported file type [2020-06-05T13:00:31.7074253+00:00 Microsoft.AspNetCore.Server.Kestrel DBG] Connection id "0HM09A1MAAR21" started. [2020-06-05T13:00:31.7077051+00:00 Microsoft.AspNetCore

字节跳动Java岗4面面经分享:JVM+索引+Redis +手撕算法+CAS

我的未来我决定 提交于 2020-08-13 18:42:06
字节跳动一面: JVM的组成; 多态的实现; 内部类为何可以访问外部类对象的属性及方法; HashMap的源码Redis dictht源码分析、存放数据时发现正在扩容会怎么样: 如何判断SQL语句用到了哪些锁; MySQL索引的类型; Redis V.S. Memcached; MySQL主从复制的方式, CAS原理、含义、底层实现、存在的问题; 项目相关问题; 手撕算法:变形的二分查找。 字节跳动二面: B树什么时候的高度会变高; 数据库隔离级别、索引、RR隔离级别下的SQL查询结果; 多进程与多线程模式的区别; 守护进程、僵尸进程、 孤儿进程,如何创建守护进程; 一次HTTP请求涉及的网络协议及全过程; 手撕算法:系统用户在线峰值及持续时间统计。 字节跳动三面: Java存在内存溢出的现象吗,内存的分配方式、GC机制; final、finally fialize 的区别与用法; 设计模式之单例模式; Java的反射、含义、使用、底层实现; 悲观锁、乐观锁在数据库、Java中的实现; TCP拥塞控制原理; time-wait连接过多的原理如何解决; 手撕算法:子串匹配问题。 字节跳动四面: 项目介绍; 请介绍一下你了解的源码; 手撕算法:三面手撕算法变形(未能想出最优解,还是太菜了) ; 系统设计。 整体来讲,头条的面试官的水平非常高、善于引导面试者,整个面试过程十分享受