redis分布式锁

Redis面试题

萝らか妹 提交于 2019-12-02 21:17:58
1.Redis支持的数据类型? 答:五种,在第一节redis相关的博客我就说过,String,Hash,List,Set,zSet,也就是我们的字符串,哈希,列表,集合,有序集合五种。结构图如下。 2.什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么? 答:Redis持久化主要分为三种,RDB、AOF还有我们的混合持久化,RDB是一个二进制文件,AOF是保存我们的每一次操作的命令,默认是使用RDB的持久化方式。RDB,二进制文件,速度快,但是数据安全性差,可能造成数据的丢失,AOF,命令文件,速度慢,数据安全性视配置文件而定,相对要更安全一些,数据不容易丢失,BGREWRITEAOF重写可以压缩我们已有的AOF文件,混合持久化模式就是以RDB和AOF共同使用的。 3.Redis 有哪些架构模式?讲讲各自的特点 答:主从模式,一般是一个主节点,一或多个从节点,为了保证我们的主节点宕机后,数据不丢失,我们将主节点的数据备份到从节点,从节点并不进行实际操作,只做实时同步操作,并不能起到高并发的目的。   哨兵模式,一个哨兵集群和一组主从架构组成。比主从更好的是当我们的主节点宕机以后,哨兵会主动选举出一个主节点继续向外提供服务。   集群架构,由很多个小主从聚集在一起,一起向外提供服务的,将16384个卡槽切分存储,并不是一个强一致性的集群架构

Redis 在项目中合理使用经验总结

懵懂的女人 提交于 2019-12-02 20:13:23
转自:https://my.oschina.net/u/920698/blog/3031587 背景 Redis 是一个开源的内存数据结构存储系统。 可以作为数据库、缓存和消息中间件使用。 支持多种类型的数据结构。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence)。 通过 Redis 哨兵(Sentinel)和 Redis 集群(Cluster)的自动分区,提供高可用性(high availability)。 基本数据类型 字符串(strings) 1、string 的过期时间在重新设置值之后会被清除 127.0.0.1:6379> set hello 3 OK 127.0.0.1:6379> get hello "3" 127.0.0.1:6379> ttl hello (integer) -1 127.0.0.1:6379> expire hello 3000 (integer) 1 127.0.0.1:6379> set hello 4 OK 127.0.0.1:6379> ttl hello (integer) -1 2、设置 string 类型的值可以覆盖任何其他类型 127.0.0.1:6379>

java架构之路-(Redis专题)redis面试助力满分+

人盡茶涼 提交于 2019-12-02 18:09:19
1.Redis支持的数据类型? 答:五种,在第一节redis相关的博客我就说过,String,Hash,List,Set,zSet,也就是我们的字符串,哈希,列表,集合,有序集合五种。结构图如下。 2.什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么? 答:Redis持久化主要分为三种,RDB、AOF还有我们的混合持久化,RDB是一个二进制文件,AOF是保存我们的每一次操作的命令,默认是使用RDB的持久化方式。RDB,二进制文件,速度快,但是数据安全性差,可能造成数据的丢失,AOF,命令文件,速度慢,数据安全性视配置文件而定,相对要更安全一些,数据不容易丢失,BGREWRITEAOF重写可以压缩我们已有的AOF文件,混合持久化模式就是以RDB和AOF共同使用的。 3.Redis 有哪些架构模式?讲讲各自的特点 答:主从模式,一般是一个主节点,一或多个从节点,为了保证我们的主节点宕机后,数据不丢失,我们将主节点的数据备份到从节点,从节点并不进行实际操作,只做实时同步操作,并不能起到高并发的目的。   哨兵模式,一个哨兵集群和一组主从架构组成。比主从更好的是当我们的主节点宕机以后,哨兵会主动选举出一个主节点继续向外提供服务。   集群架构,由很多个小主从聚集在一起,一起向外提供服务的,将16384个卡槽切分存储,并不是一个强一致性的集群架构

PHP实现Redis分布式锁

[亡魂溺海] 提交于 2019-12-02 16:37:56
锁在我们的日常开发可谓用得比较多。通常用来解决资源并发的问题。特别是多机集群情况下,资源争抢的问题。但是,很多新手在锁的处理上常常会犯一些问题。今天我们来深入理解锁。 一、Redis 锁错误使用之一 我曾经见过有的项目把查询结果存储到 Redis 当中时的伪代码如下: $redis = new \Redis('127.0.0.1', 6379); $cacheKey = 'query_cache'; $result = $redis->get($cacheKey); if ($result) { // 缓存有效则直接返回。 return $result; } else { // 缓存失效则重新获取并存储到 Redis。 $mysqlResult = []; $redis->set($cacheKey, json_encode($mysqlResult), 3600); return $mysqlResult; } 初看代码并不会发现问题所在。通常情况下,当服务器资源压力非常小的时候,这段代码不会有任何问题。并且,真的可以提升服务器吞吐性能。 假如,这个位置的代码出现了单点压力呢?比如,这个功能是统计结果,查询数据库需要花 5s。而且,由于该功能比较常用,单位时间内达到了 1000 次/秒。 这时就会出现并发穿透问题。 1000 个请求同时到达这个程序位置,都去读取缓存是否存在

redis

帅比萌擦擦* 提交于 2019-12-02 16:23:13
Redis支持的数据类型? String字符串: 格式: set key value string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个键最大能存储512MB。 Hash(哈希) 格式: hmset name key1 value1 key2 value2 Redis hash 是一个键值(key=>value)对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 List(列表) Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 格式: lpush name value 在 key 对应 list 的头部添加字符串元素 格式: rpush name value 在 key 对应 list 的尾部添加字符串元素 格式: lrem name index key 对应 list 中删除 count 个和 value 相同的元素 格式: llen name 返回 key 对应 list 的长度 Set(集合) 格式: sadd name value Redis的Set是string类型的无序集合。 集合是通过哈希表实现的,所以添加,删除

我掏空了各大搜索引擎,给你整理了154道Java面试题!

久未见 提交于 2019-12-02 15:50:20
转自: https://mp.weixin.qq.com/s?__biz=MzA4NjgxMjQ5Mg==&mid=2665762822&idx=1&sn=8f5f0cc4a678c184b78088590ceea1ef&chksm=84d20225b3a58b3383e9b3bf07ee8649c6872d133f2ef3b2aaf9d681a7a9df22f0df3d81203b&token=123684230&lang=zh_CN#rd Java集合22题 ArrayList 和 Vector 的区别。 说说 ArrayList,Vector, LinkedList 的存储性能和特性。 快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么? hashmap 的数据结构。 HashMap 的工作原理是什么? Hashmap 什么时候进行扩容呢? List、Map、Set 三个接口,存取元素时,各有什么特点? Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是 equals()? 它们有何区别? 两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对? heap 和 stack 有什么区别。 Java 集合类框架的基本接口有哪些? HashSet 和 TreeSet

Redis的三个框架:Jedis,Redisson,Lettuce

拟墨画扇 提交于 2019-12-02 15:34:38
Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html redisson 官网地址:https://redisson.org/ redisson git项目地址:https://github.com/redisson/redisson lettuce 官网地址:https://lettuce.io/ lettuce git项目地址:https://github.com/lettuce-io/lettuce-core 概念:   Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持,   Redisson:实现了分布式和可扩展的Java数据结构。   Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。 优点:   Jedis:比较全面的提供了Redis的操作特性   Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列   Lettuce:主要在一些分布式缓存框架上使用比较多 可伸缩: Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行

Redis相关知识

与世无争的帅哥 提交于 2019-12-02 12:30:16
1.什么是redis? Redis 是一个基于内存的高性能key-value 数据库 。 2.Redis的特点 Redis 本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据。因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。 另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 3.使用redis有哪些好处? 速度快:因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 支持丰富数据类型:支持string

Redis实现分布式锁

耗尽温柔 提交于 2019-12-02 11:05:07
需求   最近负责的一个项目是微服务开发,我所开发的服务里有个定时任务,如果在集群环境下仅仅使用@scheduled,会发生定时任务幂等的问题。   可以采取的解决方案:   1.通过在配置文件设置定时任务开关,只允许一台开启定时任务。考虑到使用了nacos作为配置中心,单节点定时任务对单台服务器的压力以及单点故障问题,不采用。   2.搭建一套分布式任务调度系统。考虑到时间紧急及目前定时任务比较少,不采用。   3.使用分布式锁。由于项目本身就使用到redis,而且开发成本低,采用。 分布式锁介绍   什么是分布式锁?   分布式锁是控制分布式系统之间共同访问共享资源的⼀种锁实现   为什么要用分布式锁?   在单节点系统中,我们可以通过synchronized和lock保证同⼀个⽅法在同一个时刻被同一个线程调用。但是在分布式系统中,这就不管用了,因此,我们使用分布式锁的目的是保证在分布式部署的应⽤集群中,同⼀个⽅法在同⼀时刻只能被⼀台机器上的⼀个线程执⾏。就像需求中提到到,同一时刻只有一台机子在执行定时任务。 实现原理和思路   原理:通过Redis的setnx key value命令,当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。   思路:   1.获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间

java架构之路-(Redis专题)SpringBoot连接Redis超简单

孤街醉人 提交于 2019-12-02 07:52:54
  上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis 主从架构    如何配置我上次已经讲过了, https://www.cnblogs.com/cxiaocai/p/11711377.html 。我们这次主要看如何用java来操作redis,先来复习一下上次的配置,准备三台服务器,安装redis,保证互通,两台改为slave,配置 replicaof IP 端口,主从复制是通过rdb文件来复制的。大概就这么多,配置不再多说了,我们直接上代码。   jedis   创建一个Maven项目,引入我们的jedis依赖包 <!-- 加入jedis依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 这里我就不封装连接工具类啦,我们直接看下测试代码吧 public static void main(String[] args) { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig