redis分布式锁

转:2018最全Redis面试题整理

痴心易碎 提交于 2019-11-28 05:18:39
Java面试----2018最全Redis面试题整理 1、什么是Redis? 答:Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-value数据库。 2、Redis的数据类型? 答:Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 我们实际项目中比较常用的是string,hash如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。 3、使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,Zset,hash等 (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 4、Redis相比Memcached有哪些优势? (1) Memcached所有的值均是简单的字符串

Redis常见面试题

雨燕双飞 提交于 2019-11-28 04:56:37
1. 什么是redis? Redis 是一个使用 C 语言写成的,开源的基于内存的高性能key-value数据库。 Redis的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)等多种数据结构组成。 2. Redis的特性 速度快 速度快的原因: - Redis所有数据都放在内存中 - Redis是C语言实现 - Redis使用了单线程的架构,预防了多线程可能产生的竞争问题 基于键值对的数据结构服务器 Redis中的值不仅可以是字符串,Redis的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)等多种数据结构组成,便于许多应用场景的开发并且提高了开发效率。 丰富的共鞥 提供了键过期功能,可以用来实现缓存 提供了发布/订阅功能,可以用来实现消息系统 支持Lua脚本功能,可以利用Lua创造出新的Redis命令 提供了简单的事务功能,能在一定程度上保证事务特性 提供了流水线(Pipeline)功能,减少了网络开销 简单稳定 客户端语言多 持久化 RDB(快照) AOF(日志的形式) 4.0版本开始支持RDB和AOF混用的方式聊进行持久化 主从复制 高可用和分布式 高可用实现:Redis Sentinel 分布式实现:Redis

Redis 常见面试题

混江龙づ霸主 提交于 2019-11-28 04:56:20
使用Redis有哪些好处? 速度快 基于内存,避免了磁盘I/O的瓶颈。 单进程单线程,减少了线程上下文切换的开销 利用队列技术将并行访问变为串行访问,消除了传统数据库并发访问控制锁的开销。 Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。 支持丰富的数据类型:支持string、list、set、sorted set、hash。 支持事务操作,保证操作原子性。 丰富的特性:可用于缓存、消息,按key设置过期时间,过期后将会自动删除。 redis相比memcached有哪些优势? (简单了解一下memcached) memcached所有的值均是简单的字符串,而redis支持更为丰富的数据类型。 redis的速度比memcached快很多。 redis可以支持持久化其数据。 redis常见性能问题和解决方案: 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。 Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。 Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大

Redis常见面试题

心不动则不痛 提交于 2019-11-28 04:56:10
介绍:Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。 传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式而分布式一般遵循 CAP 定理。 Github 源码:https://github.com/antirez/redis Redis 官网:https://redis.io/ 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 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 格式:

Redis常见面试题(转)

一曲冷凌霜 提交于 2019-11-28 04:55:57
介绍:Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库 ,并提供多种语言的 API的非关系型数据库。 传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式而分布式一般遵循 CAP 定理。 Github 源码:https://github.com/antirez/ redis Redis 官网:https://redis.io/ 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 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 格式:

Redis分布式锁

杀马特。学长 韩版系。学妹 提交于 2019-11-28 03:13:46
一、实现分布式锁的方式 1. 数据库乐观锁 2. Redis分布式锁 3. zookeeper分布式锁 二、锁的条件 1. 互斥性 2. 不会发生死锁 3. 容错性 4. 加锁和解锁必须是同一个客户端 三、加锁 jedis.set(key,value,NX,PX,time) 保证原子性,value为请求id保证解锁的也是同一个客户端 public class RedisTool { 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"; /** * 尝试获取分布式锁 * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @param expireTime 超期时间 * @return 是否获取成功 */ public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) { String

redis 学习2

心不动则不痛 提交于 2019-11-27 22:07:16
网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接 服务端的端口 或者 ip 默认连接的端口是6379 可以指定连接的 密码 关闭 配置 redis 关闭 关闭服务器端, 使用 kill -9 pid 即可, 当然了 关闭 redis 服务的时候并没有将最近操作的给持久化到磁盘, 因此 客户端要 执行 save 命令即可。 但是不建议这样使用 应该在 redis 安装目录 下的 src 下面 使用 ./redis-cli shutdown 这样 就可以保持 最近的记录持久化到磁盘了, redis 服务也就关闭了 基础命令 keyspace 用途:比如 多个测试环境, 每个测试环境存的数据就使用对应的 db 即可, 这样 在代码里面控制切换即可。 默认都是使用 db0 切换 DB命令: select index , 比如 select 10 就切换到 db10 了 flush flushdb 清除当前的 db flushall 清除当前所有的 keyspacce 里面的db , 所有的key dbsize 当前 db里面有多少个 key 的数量 quit 退出 客户端连接 键命令 ttl

基于zookeeper实现分布式锁和基于redis实现分布所的区别

浪子不回头ぞ 提交于 2019-11-27 21:02:49
1,实现方式不同 zookeeper实现分布式锁:通过创建一个临时节点,创建的成功节点的服务则抢占到分布式锁,可做业务逻辑。当业务逻辑完成,连接中断,节点消失,继续下一轮的锁的抢占。 redis实现分布式锁:是通过setnx命令在redis服务里面创建一个指定key,成功返回1,失败返回0,key 是唯一,会给key 设置有效期,所以创建成功则抢占到锁,实现业务逻辑,完成之后,删除该key(del), 继续下一轮锁的抢占。 2,从性能角度(从高到低) Redis > Zookeeper >= 数据库 因为redis 是数据是从在内存中 3,从可靠性角度(从高到低) Zookeeper > Redis > 数据库 来源: https://www.cnblogs.com/pickKnow/p/11376599.html

Redis

青春壹個敷衍的年華 提交于 2019-11-27 20:55:39
为什么使用Redis? Redis是一个高性能基于key/value存储数据的分布式缓存数据库,基于内存运行并且支持持久化的NoSQL数据库。 根据CAP理论(强一致性、可用性和分区容错性),一个分布式系统不可能同时很好的满足这三个要求,最多只能较好的满足其中两个要求。那么分布式系统中分区容错性是必不可少的,而且结合当下用户体验至上的理念,系统可用性是任何一个系统都必须要满足的,所以只能让系统放松对某一时刻数据一致性要求来换取系统整体伸缩性和性能上的改观。所以就需要使用redis这样的NOSQL数据库来实现对数据的保存和操作。 Redis的三个重要特点: l Redis支出数据的持久化,可以将内存中的数据写进磁盘,还可以再次加在进磁盘继续使用 l Redis不仅仅支持简单的Key-value类型的数据,还支持list、set、哈希、以及zset等数据结构的存储 l Redis支持Master-Slaver模式的数据备份 Redis的优点与缺点 l 读写速度快,因为数据都是在内存中存放的; l 支持丰富的数据类型; l 所有的操作都是原子操作,部分支持事务 l 丰富的特性:可用于缓存、消息或者按Key设置过期时间等 Redis的数据类型、底层实现以及各种数据类型的使用场景 Redis的数据类型一共有五种: 数据类型 底层实现 特点 String 就是String类型的底层实现

redis06

淺唱寂寞╮ 提交于 2019-11-27 20:33:16
缓存的使用与设计 1.受益 加速读写 CPU L1/L2/L3 Cache、浏览器缓存、Ehcache缓存数据库结果 降低后端负载 后端服务器通过前端缓存降低负载:业务端使用Redis降低后端MySQL的负载 2.成本 数据不一致:缓存层和数据层有时间窗口不一致问题,和更新策略有关 代码维护成本:多了一层缓存逻辑 运维成本:例如Redis Cluster 3.使用场景 降低后端负载 对高消耗的SQL:join结果集/分组统计结果缓存 加速请求响应 利用Redis/Memcache优化IO响应时间 大量写合并为批量写 入计数器先Redis累加再批量写DB 缓存的更新策略 LRU等算法剔除:例如 maxmemory-policy 2.超时剔除:例如expire 3.主动更新:开发控制生命周期 4.两条建议 低一致性数据:最大内存和淘汰策略 高一致性:超时剔除和主动更新结合,最大内存和淘汰策略兜底 缓存粒度问题 通用性:全量属性更好 占用空间:部分属性更好 代码维护:表面上全量属性更好 缓存穿透优化 查询一个不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询 产生原因 业务代码自身问题 恶意攻击、爬虫 发现问题 业务的响应时间,受到恶意攻击时,普遍请求被打到存储层,必会引起响应时间提高,可通过监控发现 业务本身问题