Redis

【分布式】分布式锁都有哪些实现方案?

核能气质少年 提交于 2020-11-09 12:50:59
一、业务场景 同一个jvm里多个线程操作同一个有状态的变量,可以通过JVM内的锁保证线程安全。 如果是多个JVM操作同一个有状态的变量,如何保证线程安全呢? 这时候就需要分布式锁来发挥它的作用了 二、特点 分布式系统往往业务流量比较大、并发较高,对分布式锁的高可用和高性能有较高的要求。一般分布式锁的方案需要满足如下要求: 有高可用的获取锁和释放锁功能 获取锁和释放锁的性能要好 这把锁要是一把可重入锁(避免死锁) 这把锁最好是一把阻塞锁(根据业务需求考虑要不要这条) 这把锁最好是一把公平锁(根据业务需求考虑要不要这条) 三、基于数据库的分布式锁方案 1、基于表主键唯一做分布式锁 利用主键唯一的特性,如果有多个请求同时提交到数据库的话,数据库会保证只有一个插入操作可以成功,那么我们就可以认为操作成功的那个线程获得了该方法的锁,当方法执行完毕之后,想要释放锁的话,删除这条数据库记录即可 1.1、缺点 数据库单点 没有锁超时机制 不可重入 非公平锁 非阻塞锁 1.2、优化点 数据库主从备份,解决单点问题。因为主从同步有延迟,可能导致数据不一致 定时任务检测锁超时自动释放或者通过 connection.commit() 操作来释放锁 加锁加上机器和线程信息,加锁之前先查询,支持可重入 中间表,记录加锁失败的机器线程,按照创建时间排序 自旋实现阻塞效果 1.3、原理

字节跳动大神亲自总结SpringBoot手册,让你可以在简历上写精通SpringBoot!

让人想犯罪 __ 提交于 2020-11-09 12:46:03
Spring相信大家都用过,那一堆的配置,用起来就好比:你要吃饭,饭是熟的,但是你还要自己(配置)加油盐酱醋,还得搅拌均匀,然后才能吃...... 但是无奈,你的简历上还是得写“精通Spring Boot”。。。那总得大体说得上SpringBoot是个啥东西吧! 学习会了Spring Boot之后,你总得还有一个举一反三的效果,哎说了这么多,不就是为了简历上那一句:精通Spring Boot吗? 总结了两份SpringBoot的学习PDF,免费分享出来,希望大家可以在自己的简历上加上这句“精通Spring Boot”!加油 奥利给! SpringBoot精髓 这份PDF系统介绍了Spring Boot2的主要技术,侧重于两个方面,一方面是极速开发一个Web应用系统,详细介绍Spring Boot框架、Spring MVC、视图技术、数据库访问技术,并且介绍多环境部署、自动装配、单元测试等高级特性。 另一方面, 当系统模块增加,性能和吞吐量要求增加时,如何平滑地用Spring Boot实现分布式架构,也会在后半部分介绍,包括使用Spring实现RESTful架构,在Spring Boot框架下使用Redis、MongoDB、 ZooKeeper、 Elasticsearch 等流行技术,使用Spring Session 实现系统水平扩展,使用Spring Cache提高系统性能。

Redis(设计与实现):---发布与订阅之查看订阅信息(PUBSUB CHANNELS/NUMSUB/NUMPAT命令)

て烟熏妆下的殇ゞ 提交于 2020-11-09 11:26:58
PUBSUB命令是Redis 2.8新增加的命令之一,客户端可以通过这个命令来查看频道或者模式的相关信息,比如某个频道目前有多少订阅者,又或者某个模式目前有多少订阅者,诸如此类。 PUBSUB命令是Redis 2.8新增加的命令之一 ,客户端可以通过这个命令来 查看频道或者模式的相关信息 ,比如某个频道目前有多少订阅者,又或者某个模式目前有多少订阅者,诸如此类 下面将分别介绍PUBSUB命令的三个子命令,以及这些子命令的实现原理 一、PUBSUB CHANNELS命令 功能: 用于返回服务器当前被订阅的频道 命令格式如下: PUBSUB CHANNELS [ pattern ] 其中pattern参数是可选的: 如果不给定pattern参数,那么命令返回 服务器当前被订阅的所有频道 如果给定pattern参数,那么命令返回服务器 当前被订阅的频道中那些与pattern模式相匹配的频道 命令的实现 这个子命令是通过 遍历服务器pubsub_channels字典的所有键(每个键都是一个被订阅的 频道) ,然后记录并返回所有符合条件的频道来实现的 这个过程可以用以下伪代码来描述: def pubsub_channels ( pattern = None ) : # 一个列表,用于记录所有符合条件的频道 channel_list = [ ] # 遍历服务器中的所有频道 #

手写redis客户端

那年仲夏 提交于 2020-11-09 10:56:31
一、RESP通信协议 Redis Serialization Protocol (Redis序列化协议). 特点:容易实现、解析快、可读性强 以\r\n分割数据. 二、撸代码 package com.dongnao.demo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * Created by crescendo.tian on 2018/8/27. */ public class TqRedis { private Socket socket; private OutputStream write; private InputStream read; public TqRedis(String host, int port) throws IOException { socket = new Socket(host, port); } public void set(String key, String val) throws IOException { StringBuffer sb = new StringBuffer(); sb.append( "*3").append("\r\n"); //

爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key

我只是一个虾纸丫 提交于 2020-11-09 07:20:30
爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key 参考文章: (1)爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key (2)https://www.cnblogs.com/memoa/p/10576852.html 备忘一下。 来源: oschina 链接: https://my.oschina.net/u/4432649/blog/4708482

Redis的过期策略和内存淘汰策略

不问归期 提交于 2020-11-09 06:43:16
Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。 过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。) Redis中同时使用了惰性过期和定期过期两种过期策略。 Redis的内存淘汰策略

Redis的过期策略和内存淘汰策略

倖福魔咒の 提交于 2020-11-09 04:27:34
自己将Redis的过期策略和内存淘汰策略搞混淆了。 Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。 过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)

一个人竟然撸了一个网易云音乐云村

若如初见. 提交于 2020-11-09 02:00:16
来源:GitHub精选 Hi!大家好呀!我是你们可爱的喵哥! 今天推荐的这个项目是「 netease-cloud-music-community 」,是一个参照网易云音乐云村做的小程序社区,后端技术栈为 Java,SpringBoot,MySQL,Redis,前端技术栈为 uni-app。 功能简介 微信登录,发文本动态,发图文动态,发视频动态,关注,转发,评论,点赞,收藏等等。 技术栈 后端:Java,SpringBoot,MyBatis,MySQL,Redis 前端:uni-app 开发环境 后端:IntelliJ IDEA 前端:HbuilderX,微信开发者工具,QQ 小程序开发者工具 项目运行 后端: 1、创建数据库,执行根目录中的 live.sql,并修改 artist 表中的微信 APPID 等配置 2、使用 IDEA 导入 live-backend-mp 项目,并通过 Modules 的方式导入 live-backend-common 项目 3、修改 application-dev 中的 MySQL,Redis,阿里云 OSS 配置 前端: 1、使用 Hbuilder 导入项目 2、修改 manifest.json 的 APPID 配置(微信小程序或 QQ 小程序) 3、修改 App.vue 中的 domain 配置(修改为后端项目的路径) 4、运行到微信小程序