今天学习redis中的字典。 结构介绍 字典,C语言中没有内置这种数据结构,所以redis自己构建了实现。 hash类型的数据底层就是字典。 redis的哈希表采用链地址法来解决键冲突,上面的整个结构图中的哈希节点dictEntry有一个next指针,他是指向下一个节点的。 最新的节点添加到链表的表头位置,这样是为了速度考虑。 简单来说,比如我们现在有10个空间,但是我数据量有30个,这已经平均每个空间都有链表,且链表长度为3。 再比如我们现在有10个空间,数据量只有1个,这是不是太浪费空间了。我们是不是要收缩空间,等数据量大的时候,我们再扩展嘛。 那扩展和收缩的条件是什么呢?
然而,Redis的持久化、异步删除和集群同步等功能实际上是由其他线程完成的。因此,将Redis称为单线程,更多是一种简化的说法,它实际上是一种高效的多线程设计。 Redis为何选择单线程? 深入探索多路复用 多路复用技术是Redis的另一个超能力。它允许Redis在单线程中同时监听多个套接字,当数据到达时,内核会触发事件并将其放入队列,Redis线程随后处理这些事件。 Redis 6.0 多线程模型的改进 Redis 6.0引入了多线程模型,这是相对于之前版本的一个重要改进。 快照生成的命令与策略 Redis提供了两种生成RDB文件的命令: SAVE:在主线程中执行,会阻塞Redis服务,等待快照完成。这种命令在生产环境中很少使用,因为它会显著影响Redis的性能。 Redis的扩展性保证 Redis的扩展性主要体现在以下几个方面: 集群模式:Redis集群通过数据分片,将数据分散存储在多个节点上,每个节点负责处理一部分数据。
Redis使用单线程模型,不仅使Redis服务端处理模型变得简单,也使客户端开发变得简单。 Redis不需要依赖操作系统中的库,Redis自己实现了事件处理的相关功能。 主从复制 Redis 提供了复制功能,实现了多个相同数据的Redis副本(Replica)复制功能是分布式Redis的基础。 高可用和分布式 Redis 提供了⾼可⽤实现的Redis哨兵(Redis Sentinel),能够保证Redis结点的故障发现和故障⾃动转移。 键空间通知的增强 SCAN系列命令:提供了基于游标的迭代器,可以安全的遍历数据库中的键,替代了会阻塞服务的 KEYS 命令。 Redis 3.2(2016) 核心特性: GEO地理空间索引:新增一系列GEO命令,可以存储和查询地理位置信息,支持计算距离、范围内搜索。
一:Redis的常见数据类型有哪些 Redis 是典型的 “ 键值型 ” 数据库,不同数据类型其 key 结构一致, value 有所差异。 String 类型是 Redis 中最常见的数据类型, value 与 key 一样都是 Redis 自定义的 字符串结构,称为 SDS 。 八:Redis分布式锁如何实现 Redis 实现分布式锁主要利用 Redis 的 setnx 命令。 九:Redis的数据过期策略有哪些 数据删除策略: Redis 中可以对数据设置数据的有效时间,数据的有效时间到了以后,就需要将数据从内存中删除掉。 定期清理的两种模式: SLOW 模式是定时任务,执行频率默认为 10hz ,每次不超过 25ms ,以通过修 改配置文件 redis.conf 的 hz 选项来调整这个次数
要想重启后依然生效,得修改配置文件[root@m2 tmp]# grep slave-read-only redisnew.confslave-read-only no[root@m2 tmp]# ----连接认证redis requirepass 配置一下简单的认证127.0.0.1:6379> CONFIG GET requ*1) "requirepass"2) ""127.0.0.1:6379> exit[root@m1 ~]# redis-cli
redis 慢查询 什么是慢查询 MySQL会记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询,都记在慢查询日志里。 redis 的生命周期 客户端向Redis服务器发送命令 命令请求在请求队列中排队等待处理 执行命令 返回命令结果 ? redis 慢查询 慢查询发生在生命周期的第三阶段,是指仅仅执行命令阶段比较慢被称为慢查询。 客户端超时不一定是慢查询,但是慢查询时是客户端超时的一个可能因素。 redis 慢查询相关配置 1. slowlog-max-len 它决定了慢查询日志最多能保存多少条日志,slow log本身是一个内存中的FIFO队列,当队列大小超过slowlog-max-len时, 获取慢查询列表中的慢查询信息 2. slowlog len 含义:获取慢查询队列长度 slowlog reset 含义:清空慢查询队列 慢查询运维经验 slowlog-max-len 不要设置过大,默认10ms
; Redis是内存数据库,因此它有足够好的读写性能; Redis支持持久化,redis支持AOF和RDB两种持久化方式,确保了内存中的数据不会“丢失”; Redis的sentinel和复制功能保证了Redis 使用场景 Redis 适合做什么 缓存,Redis本身是内存数据库,注定有极高的读写速度和吞吐,加上数据过期功能以及完善的数据淘汰策略使得Redis拥有与生俱来的缓存潜质。 Redis 不适合做什么 每种产品都有自己的特定的应用领域。Redis也不是万能的。 Redis是内存数据库,相比磁盘类型的数据库成本要高不少,注定了Redis不能用于存储大规模的数据(土豪忽略)。 深探入微 作为最佳实践本章将会把主要的关注点放和在Redis用户相关的一些Redis基本知识,这部分知识是Redis用户需要了解并在实际使用Redis过程中要考虑的。 reference Redis官网 Redis开发与运维 How Twitter Uses Redis To Scale - 105TB RAM, 39MM QPS, 10,000+ Instances
一、 本章我们将用简短的几句话来帮助你快速的了解什么是redis,初学者不必深究 1 Redis简介 Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写、 、key-value数据库,并提供多种语言的API 它通常被称为数据结构服务器,因为值value可以是字符串String,哈希Map,列表list,集合set和有序集合sorted set等类型 2 Redis 3.支持通过Replication 进行数据复制,通过master-slave 机制,可以实时进行数据同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA(Hight Availability 4.单进程请求,所有命令串行执行,并下发情况下不需要考虑数据一致性问题 5 Redis读写的速度非常的快
目录 一、前言 二、Java使用Redis 三、总结 四、历史文章指路 一、前言 上文【Redis系列】一文带你入门Redis 介绍如何搭建Redis环境,并对Redis做了基本介绍,这篇则介绍通过Java 使用Redis,首先引入Redis依赖,主要方法有:连接Redis,插入Redis,查询Redis,删除Redis,批量查询Redis。 二、Java使用Redis <! -- Redis依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> = null) { jedis.auth("root"); //如redis没有设置密码, 则无需添加此行 System.out.println("连接Redis成功"
,计时器 等等 Redis 有啥特性 多样的数据类型 持久化 集群 事务处理 学习 Redis 需要用到的资料 官网:https://redis.io/ 中文网站:http://www.redis.cn / 下载地址: 如何安装 Redis window 下安装 Redis 1、官网上下载 windows Redis 的安装包:https://github.com/tporadowski/redis/ 服务端 redis-client redis 客户端 redis-check-aof 和 redis-check-rdb redis 的持久化工具 redis-benchmark redis 的检测工具 :/# redis-server /usr/local/redis/redis-6.2.5/redis.conf root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-cli -p redis 默认是有 16 个数据库的,咱们可以查看 redis.conf 文件中有定义 # vim /usr/local/redis/redis-6.2.5/redis.conf redis 默认是使用第
Mysql And Redis基础与进阶操作系之存储函数和MySQL 触发器 1.Mysql 存储函数简介 MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能 举例 数据准备 create database if not exists mydb10_trigger; use mydb10_trigger; 用户表 create table user(
官网:http://redis.io/ 推荐一个开源组件:StackExchange.Redis https://github.com/StackExchange/StackExchange.Redis 主要类是 StackExchange.Redis.ConnectionMultiplexer,它隐藏了多个Redis服务器的细节,它设计用于在多个调用方共享和复用,也就是说不要在每个调用都创建新的。 三种典型使用场景 访问 Redis Database IDatabase db = redis.GetDatabase(); 这个对象is a cheap object,不要保存,每次使用直接创建即可。 获取了Database对象之后,就可以使用Redis API. Using Redis Pub/Sub ISubscriber sub = redis.GetSubscriber(); 同样这个对象is a cheap object,不用保存。
1 简介 Redis 集群是Redis 的一个分布式实现,它是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接。现在来看看Redis集群实现了哪些目标? 那么Redis集群环境与非分布式Redis环境在功能上有没有什么不同的呢? Redis中提供集群命令行工具 redis-trib 来简化集群操作 在执行redis-trib.rb文件之前需要安装ruby环境,嫌麻烦可以直接运行下面命令 yum install centos-release-scl-rh M 31 Jul 21:06:21.546 # Failover auth granted to aba761321b40112c0b8de29d810767a40c59d27b for epoch 10 Redis官网:https://redis.io Redis中文网:http://www.redis.cn 本篇的集群配置文件:https://github.com/rainbowda/learnWay
Redis服务器初始化没什么较大的区别。 */ } sentinel; 启动哨兵出现的日志如下 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo # Redis version=4.9.103, bits 5.1 获取主服务器信息 哨兵默认会以10s一次的频率,发送命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息。 选择过程会过滤掉不符合要求的服务器: 处于下线或者断线状态的从服务器 最近5秒内没有回复过领头哨兵的INFO信息的从服务器 与已下线主服务器连接断开超过(down-after-milliseconds * 10 (与主服务器客观下线时间进行比较) 新的主服务器只选择通过上面的测试,并在上面的标准基础上排序: Slave通过Redis实例的redis.conf文件配置的slave-priority排序。
为了实现重启后数据不丢失,Redis提供了两种持久化的方案,一种是RDB快照(RedisDataBase),一种是AOF(AppendOnlyFile)。 RDB RDB是Redis默认的持久化方案。 save 900 1 // 900秒内至少有一个key被修改(包括添加) save 300 10 //400秒内至少有10个key被修改 save 60 10000 //60秒内至少有10000个key Redis提供了两条命令: 命令 说明 save save在生成快照的时候会阻塞当前Redis服务器,Redis不能处理其他命令。如果内存中的数据比较多,会造成Redis长时间的阻塞。 为了解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。 如果是no,用户必须手动redis-check-aof修复AOF文件才可以。默认值为yes。 AOF数据恢复 重启Redis之后就会进行AOF文件的恢复。
Redis的操作命令 1 基础命令 获得符合规则的键名称 keys 表达式(?,* ,[],\?)。 其中,?:匹配任意一个字符;*:匹配0个或者多个任意字符;[]:匹配括号间的任一字符;\? exists key 删除键 del key del key1 key2 获得键值的数据类型type 返回值可能是这五种类型(string,hash,list,set,sorted set) 注意:Redis
redis是NOSQL数据库,所以也存在事务,只是此事务和关系型数据库的事务是有区别的。 事务实例 Redis中事务的使用其实非常简单,通过MULTI命令即可。 如下 127.0.0.1:6379> exec 1) OK 2) OK 3) OK 4) OK 5) "bbb" 事务异常 事务中的异常有两种情况: 进入队列之前发生错误 比较常见的命令错误,此类异常redis (error) ERR syntax error # 执行命令的时候错误提示 4) OK 127.0.0.1:6379> keys kk* 1) "kk1" 2) "kk2" 3) "kk4" 注意 redis 执行exec命令后发生的异常 对于这种情况,redis中也不会做特别的处理。 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速 Watch watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。
在 Redis 系列(九)底层数据结构之五种基础数据类型的实现中其实就提到了,那么应该在此之前先介绍它吗? 结论:想那么多屁事,写就完事了。 它可以是以下任意一种: REDIS_ENCODING_INT long 类型的整数 REDIS_ENCODING_ENBSTR embstr 编码的简单动态字符串(不知道的可以去看上一篇文章) REDIS_ENCODING_RAW 简单动态字符串 REDIS_ENCODING_HT 字典 REDIS_ENCODING_LINKEDLIST 双端链表 REDIS_ENCODING_ZIPLIST 压缩列表 REDIS_ENCODING_INTSET 敬请查看 Redis 系列(九)底层数据结构之五种基础数据类型的实现 类型检查与命令多态 如果读者熟悉 Redis 的命令的话(不熟没关系,看下一篇文章), 就会发现,Redis 的命令设计维度不是单一的 Redis 不是最缺内存了吗? 是的,这样子当然是省内存,但是** Redis 是一个高性能的内存数据库**. 性能这一块,Redis 卡的死死的。
背景介绍 以下摘自:Redis 官网。 各种语言都提供了 Redis 的客户端,比如 Java 的Jedis和 python 的redis-py. 同时 Redis 也提供交互式的客户端,在 mac 上执行: brew install redis进行安装,安装完成后执行: redis-cli 进入交互式的客户端,即可开始使用。 sscan key 0 match o* count 10. 将返回 set 中以 o 开头的 10 个元素,可以继续使用游标来扫描。 SDIFF: 返回第一个集合和其他集合不同的元素。 HSCAN key 0 match uu* count 10 HSTRLEN: 返回该列的值的长度。HSTRLEN key field. HVALS: 返回所有的值。只有值没有列名。
安装 Redis 有关于 Redis 的下载地址 https://redis.io/download step3: 下载 Redis 的安装包 # 进入到用户软件安装目录,在此目录下安装 redis # 将下载好的压缩包进行解压 tar -zxf redis-6.0.8.tar.gz step4: 编译与安装 Redis # 进入解压后的 Redis 目录 cd redis-6.0.8/ # 启动 Redis 服务器 # 进入Redis 的安装目录 cd /usr/local/redis-6.0.8/src/ # 启动 Redis 服务器 . /redis-server Redis 服务器的其他几种启动方式 # 使用指定路劲下的配置文件启动 Redis 服务器 . /redis-server /path/to/redis.conf # 指定端口启动 Redis .