redis学习交流分享
Redis 3.2.0学习

Redis 3.2.0学习1.Redis介绍Redis是一个内存中的key-value结构存储系统,NoSQL数据库服务器。
存储数据类型丰富,有字符串(strings), 散列(hashes), 列表(lists),集合(sets), 有序集合(sorted sets)。
Redis有单机、主从、集群的应用部署,目前(2016-6-1)主流应用版本是Redis 2.8,在各公司生产环境应用,最新版本Redis 3.2.0,Redis3.0后的最新版本自带集群功能(Redis-Cluster)。
2.Redis安装安装环境:CentOS release 6.5单独使用命令安装Redis-Cluster比较麻烦,redis的作者为了简化Redis-Cluster的搭建,使用ruby作为redis的客户端语言,实现了一个工具包redis-trib.rb。
所以,在安装Redis 前,需要检查CentOS是否安装了gcc和ruby(ruby如果不使用Redis-Cluster功能,可以不需要)。
1.安装必要的包:检查是否安装gcc和ruby,没有安装相应包。
rpm -qa | grepgccrpm -qa | grep rubyGcc安装:yum install –y gcc*Ruby安装:yum install –y ruby2.下载Redis:wget http://download.redis.io/releases/redis-3.2.0.tar.gz3.安装Redis:移动Redis安装包到/usr/src目录下,解压文件,进入redis-3.2.0中,使用make 命令编译源文件,使用root权限安装Redis。
mv redis-3.2.1.tar.gz /usr/src/tar –zxvfredis-3.2.0.tar.gzcd redis-3.2.0makemake testsudo make install在/usr/src/redis-3.2.0目录下,使用src/./redis-server启动Redis,检查Redis是否安装成功。
redis的主从原理

redis的主从原理你知道 Redis 吗?它可厉害啦!今天咱们就来聊聊 Redis 的主从原理,这可有趣着呢!Redis 主从模式啊,就像是一个团队里有个老大和一群小弟。
老大呢,就是主节点,小弟们就是从节点。
主节点那可是威风凛凛,承担着最重要的任务。
主节点就像是一个知识渊博的大师傅,它手里掌握着所有的数据。
它不停地接收、处理和存储各种信息,忙得不可开交。
而从节点呢,就像是一群虚心好学的小徒弟,它们眼巴巴地盯着主节点,等着主节点传授知识。
从节点可乖啦,它们会主动向主节点请求数据同步。
就好像在说:“大师傅,我要向您学习,快把您的本事传给我吧!”主节点也很大方,会把自己的数据一股脑儿地发给从节点。
当主节点有新的数据进来或者数据有了修改,它会把这些变化告诉从节点。
从节点收到消息后,赶紧更新自己的数据,保证和主节点保持一致。
这就像是主节点一声令下,从节点立马行动,不敢有丝毫懈怠。
为啥要有主从模式呢?这可大有讲究!想象一下,如果只有一个 Redis 节点,那它要是累趴下了或者出了啥问题,那咱们的数据不就危险啦?但是有了主从模式,就多了一份保障。
主节点万一不行了,从节点可以马上顶上去,继续为咱们服务,数据也不会丢失。
而且啊,主从模式还能让咱们的系统性能更强大。
主节点专心处理写操作,从节点负责读操作。
这样一来,就像是分工合作,效率大大提高啦!比如说,咱们有好多用户都在读取数据,这时候从节点就发挥作用啦,它能同时处理好多读取请求,让用户们都能快速得到想要的信息,不用排队等着主节点。
还有哦,主从模式还能让咱们的 Redis 系统更能承受压力。
如果访问量一下子暴增,多个从节点一起帮忙,就能轻松应对啦!再跟你说个好玩的,从节点就像是主节点的影子,一直跟着主节点学习,模仿主节点的一举一动。
但是从节点也有自己的小脾气哦,有时候网络不好,数据同步可能会延迟或者出错,这时候就得好好检查检查,让它们重新回到正轨。
总之啊,Redis 的主从原理就像是一个有趣的团队合作故事,主节点带着从节点一起努力,为咱们的应用提供稳定、高效的数据服务。
尚硅谷Redis学习笔记(6)--Redis主从复制

尚硅⾕Redis学习笔记(6)--Redis主从复制1.是什么主机数据更新后根据配置和策略,⾃动同步到备机的master/slaver机制,Master以写为主,Slave以读为主2.能⼲嘛读写分离,性能扩展容灾快速恢复3.具体操作:主从复制1、创建myredis⽂件夹2、复制redis.conf配置⽂件到⽂件夹中3、配置⼀主多从,创建三个配置⽂件创建新的配置⽂件:redis6379.conf,redis6380.conf,redis6381.conf3.1 新建redis6379.conf,填写以下内容include /myredis/redis.confpidfile /var/run/redis_6379.pidport 6379dbfilename dump6379.rd在myredis⽂件夹下⾯的⽂件3.2 新建redis6380.conf,填写以下内容3.3 新建redis6381.conf,填写以下内容slave-priority 10设置从机的优先级,值越⼩,优先级越⾼,⽤于选举主机时使⽤。
默认1003.4 启动三台Redis服务器3.5 查看系统进程,看看三台服务器是否启动3.6 查看三台主机运⾏情况info replication打印主从复制的相关信息三台都显⽰⾃⼰是主机,没有从机3.7 配从(库)不配主(库)slaveof ip port成为某个实例的从服务器1. 在6380和6381上执⾏: slaveof 127.0.0.1 6379role的⾓⾊变成slave从机,master_host, master_port等等是主机信息主服务器信息connected_slaves连接两台从机2. 在主机上写,在从机上可以读取数据在从机上写数据报错3. 主机挂掉,重启就⾏,⼀切如初4. 从机重启需重设:slaveof 127.0.0.1 6379可以将配置增加到⽂件中。
永久⽣效。
StackExchange.Redis学习笔记(二)Redis查询五种数据类型的应用

StackExchange.Redis学习笔记(⼆)Redis查询五种数据类型的应⽤ConnectionMultiplexerConnectionMultiplexer 是StackExchange.Redis的核⼼对象,⽤这个类的实例来进⾏Redis的⼀系列操作,对于⼀个整个应⽤程序应该只有⼀个ConnectionMultiplexer 类的实例。
上⼀章中StackExchangeRedisHelper 的相关代码如下private static ConnectionMultiplexer _instance = null;///<summary>///使⽤⼀个静态属性来返回已连接的实例,如下列中所⽰。
这样,⼀旦 ConnectionMultiplexer 断开连接,便可以初始化新的连接实例。
///</summary>public static ConnectionMultiplexer Instance{get{if (_instance == null){lock (_locker){if (_instance == null || !_instance.IsConnected){_instance = ConnectionMultiplexer.Connect(Coonstr);}}}//注册如下事件_instance.ConnectionFailed += MuxerConnectionFailed;_instance.ConnectionRestored += MuxerConnectionRestored;_instance.ErrorMessage += MuxerErrorMessage;_instance.ConfigurationChanged += MuxerConfigurationChanged;_instance.HashSlotMoved += MuxerHashSlotMoved;_instance.InternalError += MuxerInternalError;return _instance;}}String string类型应该是最长⽤到的了,⽤法也很简单,下⾯展⽰了⽤Redis来进⾏基本的字符串数字存储public static IDatabase GetDatabase(){return Instance.GetDatabase();}///<summary>///设置缓存///</summary>///<param name="key"></param>///<param name="value"></param>public static void Set(string key, object value, TimeSpan? expiry = default(TimeSpan?), When when = When.Always, CommandFlags flags = CommandFlags.None) {key = MergeKey(key);GetDatabase().StringSet(key, Serialize(value), expiry, when, flags);}///<summary>///根据key获取缓存对象///</summary>///<typeparam name="T"></typeparam>///<param name="key"></param>///<returns></returns>public static T Get<T>(string key){key = MergeKey(key);return Deserialize<T>(GetDatabase().StringGet(key));}///<summary>///移除指定key的缓存///</summary>///<param name="key"></param>///<returns></returns>public static bool Remove(string key){key = MergeKey(key);return GetDatabase().KeyDelete(key);}除了基本的string类型操作,Redis同时⽀持以下⼏种类型的操作List 列表Set ⽆序集合SortedSet 有序集合Hash 哈希表下⾯我依次来介绍下这四种类型在StackExchange.Redis中的基本⽤法关于代码中的KeyDelete为删除对应的键,我这⾥是因为测试防⽌重复才加上的。
08.简单学习redis哨兵主备切换和选举算法

08.简单学习redis哨兵主备切换和选举算法⼀、选举的授权每次⼀个哨兵要做主备切换,⾸先需要quorum数量的哨兵认为odown,然后选举出⼀个哨兵来做切换,这个哨兵还得得到majority哨兵的授权,才能正式执⾏切换如果quorum < majority,⽐如5个哨兵,majority就是3,quorum设置为2,那么就3个哨兵授权就可以执⾏切换但是如果quorum >= majority,那么必须quorum数量的哨兵都授权,⽐如5个哨兵,quorum是5,那么必须5个哨兵都同意授权,才能执⾏切换⼆、选举的监控哨兵会对⼀套redis master+slave进⾏监控,有相应的监控的配置 执⾏切换的那个哨兵,会从要切换到的新master(salve->master)那⾥得到⼀个configuration epoch,这就是⼀个version号,每次切换的version号都必须是唯⼀的 如果第⼀个选举出的哨兵切换失败了,那么其他哨兵,会等待failover-timeout时间,然后接替继续执⾏切换,此时会重新获取⼀个新的configuration epoch,作为新的version号三、选举master的因素(1)跟master断开连接的时长 ⾸先,如果⼀个slave跟master断开连接已经超过了down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master (down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state(2)slave优先级 按照slave优先级进⾏排序,slave priority越低,优先级就越⾼(3)复制offset 如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级就越⾼(4)run id 如果上⾯两个条件都相同,那么选择⼀个run id⽐较⼩的那个slave四、新master配置传播 哨兵完成切换之后,会在⾃⼰本地更新⽣成最新的master配置,然后同步给其他的哨兵,就是通过之前说的pub/sub消息机制。
redis 数据库基本操作

redis 数据库基本操作Redis 数据库基本操作Redis(Remote Dictionary Server)是一个基于内存的开源数据库,常用作缓存、消息队列和持久化存储。
它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,并提供了丰富的命令集来操作这些数据结构。
本篇文章将一步一步回答关于Redis 数据库的基本操作。
第一步:Redis 数据库的安装和配置首先,我们需要下载并安装Redis 数据库。
官方网站提供了各种版本的Redis 下载,您可以根据系统的要求选择合适的版本进行下载。
安装完成后,我们还需要对Redis 进行一些基本的配置。
Redis 的配置文件位于Redis 安装目录下的redis.conf。
您可以使用文本编辑器打开此文件,根据需要修改其中的参数。
例如,您可以设置Redis 的监听地址和端口、密码验证、持久化方式等。
保存并关闭配置文件后,我们可以打开终端或命令提示符窗口,运行以下命令启动Redis 服务器:redis-server /path/to/redis.conf第二步:连接Redis 数据库在Redis 服务器启动后,我们可以使用Redis 自带的命令行工具redis-cli 来连接到数据库。
打开新的终端或命令提示符窗口,并运行以下命令:redis-cli如果Redis 服务器的地址和端口与默认值不同,您可以使用以下命令连接到指定的Redis 服务器:redis-cli -h host -p port在成功连接到Redis 数据库后,您将看到一个命令行提示符,表示您已经进入了Redis 的交互式终端。
第三步:操作Redis 数据库在进入Redis 的交互式终端后,我们可以使用各种命令对数据进行操作。
下面是一些常用的Redis 命令示例:1. 设置键值对> SET key value通过SET 命令,我们可以将指定的值赋给指定的键。
例如,我们可以使用以下命令设置一个字符串值:> SET name "John Doe"2. 获取键值对> GET key通过GET 命令,我们可以获取指定键的值。
redis使用方法

redis使用方法Redis是一款开源的高性能内存键值存储数据库,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。
Redis是一种非关系型数据库,它的特点是速度快、可扩展性好、数据持久化、应用场景广泛等。
本文将介绍Redis的使用方法,包括Redis的安装、配置、基本命令、数据结构、事务和持久化等方面。
通过本文的学习,读者可以了解Redis的基本使用方法,为使用Redis提供帮助。
一、Redis的安装Redis的安装可以通过源码编译安装或者使用包管理工具安装。
下面以Ubuntu为例,介绍Redis的安装过程。
1. 使用包管理工具安装Ubuntu系统可以通过apt-get命令安装Redis。
打开终端,输入以下命令:sudo apt-get updatesudo apt-get install redis-server安装完成后,可以通过以下命令查看Redis是否已经安装成功: redis-cli ping如果返回“PONG”表示Redis已经安装成功。
2. 源码编译安装如果需要使用最新版本的Redis,可以通过源码编译安装。
首先需要下载Redis的源码包,可以从Redis官网(https://redis.io/)下载最新版本的源码包。
下载完成后,解压源码包,进入解压后的文件夹,执行以下命令进行编译和安装:makemake install安装完成后,可以通过以下命令启动Redis服务:redis-server二、Redis的配置Redis的配置文件是redis.conf,它包含了Redis的各种配置选项。
在Ubuntu系统中,配置文件位于/etc/redis/redis.conf。
下面介绍一些常用的Redis配置选项。
1. bindbind选项指定Redis监听的IP地址,如果不指定,Redis将监听所有的IP地址。
可以通过以下命令指定Redis监听的IP地址: bind 127.0.0.12. portport选项指定Redis监听的端口号,默认为6379。
【Redis】Redis学习(三)Redis主从模式详解

【Redis】Redis学习(三)Redis主从模式详解
⼀、Redis主从模式搭建
1.1 搭建⽅式
主从模式的搭建还是很简单的,官⽹的介绍就更加简单了,只需要在配置⽂件中加上⼀⾏配置:
slaveof 192.168.1.16379
指明master的ip和端⼝号就可以了,实际上真的这么简单。
1.2 其他配置
在redis.conf中,还有⼀些关于主从的其他配置,按需配置即可。
⼆、Redis主从模式Java客户端访问
其实不怎么想介绍主从模式的Java访问⽅式,感觉没有多少意义,两个原因:
实际⽣产环境是不会单单使⽤主从模式的,因为不具备⾼可⽤性,⾄少会使⽤Sentinal集群的。
如果不是⽣产程序,平时写着玩,那么简简单单的使⽤⼀个Jedis连接就可以了。
Jedis jedis=new Jedis("127.0.0.1", 56379);
//使⽤jedis完成操作
jedis.close();
上⾯的例⼦很简单,即便搭建的是Sentinal集群,写测试⼩程序的使⽤也可以这么⽤,简单⼜⽅便。
对了Jedis的Maven依赖为:<!-- https:///artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
最新版本2.9.0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NOSQL是什么
NoSQL = ‘Not Only SQL’ 意义:适用关系型数据库的时候就使用关系型 数据库,不适用的时候也没有必要非使用关系 型数据库,可以考虑使用更加合适的数据存储。 NoSQL数据库和关系型数据库互补的关系, NoSQL数据的出现弥补了关系型数据库的不足。
NOSQL优点
REDIS的特性
自动操作 Redis对不同数据类型的操作是自动的,因此设置或增 加key值,从一个集合中增加或删除一个元素都能安全 的操作。 支持多种语言 Redis支持多种语言,诸如Ruby, Python, PHP, Perl, Lua, Java, C++等。 主-从复制 Redis支持简单而快速的主-从复制。官方提供了一个数 据,Slave在21秒即完成了对Amazon网站10G key set的 复制。 简单稳定 Redis直观的存储结构使得通过程序与Redis交互十分简单,良 好的开 发氛围和严谨的版本发布机制使得Redis的稳定版本非 常可靠,如此 多的公司在项目中使用了Redis也可以印证这一 点。
列表类型及操作指令
list 是一个链表结构,可以理解为一个每个子元素都是 string 类型的双向链表。主要功能是 push、pop、获取 一个范围的所有值等。操作中 key 理解为链表的名字。 lpush key string 在 key 对应 list 的头部添加字符串元素, 返回 1 表示成功,0 表示 key 存在且不是 list 类型。 rpush key string 在 key 对应 list 的尾部添加字符串元素。 llen key 返回 key 对应 list 的长度,如果 key 不存在返 回 0,如果 key 对应类型不是 list返回错误。 lrange key start end 返回指定区间内的元素,下标从 0 开始,负值表示从后面计算,-1 表示倒数第一个元素 , key 不存在返回空列表。 ltrim key start end 截取 list 指定区间内元素,成功返回 1,key 不存在返回错误。
列表类型及操作指令
lset key index value 设置 list 中指定下标的元素值,成功返回 1, key 或者下标不存在返回错误。 lrem key count value从 List 的头部(count正数)或尾部(count负 数)删除一定数量(count)匹配 value 的元素,返回删除的元素数 量。count 为 0 时候删除全部。 lpop key 从 list 的头部删除并返回删除元素。如果 key 对应 list 不存 在或者是空返回 nil,如果 key 对应值不是 list 返回错误。 rpop key 从 list 的尾部删除并返回删除元素。 blpop key1 ...... keyN timeout 从左到右扫描,返回对第一个非空 list 进行 lpop 操作并返回,比如 blpop list1 list2 list3 0 ,如果 list 不存在 list2,list3 都是非空则对 list2 做lpop 并返回从 list2 中删除的元素。 如果所有的 list 都是空或不存在,则会阻塞 timeout秒,timeout 为 0 表示一直阻塞。当阻塞时,如果有 client 对 key1...keyN 中的任意 key进行 push 操作,则第一在这个 key 上被阻塞的 client 会立即返 回。如果超时发生,则返回nil。有点像 unix 的 select 或者 poll。 brpop 同 blpop,一个是从头部删除一个是从尾部删除。
字符串类型及操作指令
Biblioteka mset key1 value1 ...... keyN valueN 一次设置多个 key 的值, 成功返回 1 表示所有的值都设置了,失败返回 0 表示没有任 何值被设置。 msetnx key1 value1 ...... keyN valueN 一次设置多个 key 的值, 但是不会覆盖已经存在的 key incr key 对 key 的值做++操作,并返回新的值。注意 incr 一个 不是 int 的 value 会返回错误,incr 不存在的 key,则设置 key 值为 1。 decr key 对 key 的值做--操作,decr 不存在 key,则设置 key 值为-1。 incrby key integer 对 key 加上指定值 ,key 不存在时候会设置 key,并认为原来的 value是 0。 decrby key integer 对 key 减去指定值。decrby 完全是为了可 读性,也可以通过 incrby一个负值来实现同样效果,反之一样。
REDIS的特性
速度快 Redis使用标准C编写实现,而且将所有数据加载到内 存中,所以速度非常快。官方提供的数据表明,在一 个普通的Linux机器上,Redis读写速度分别达到 81000/s和110000/s。 持久化 由于所有数据保持在内存中(2.0版本开始可以只将部 分数据的value放在内存),所以对数据的更新将异步 地保存到磁盘上,Redis提供了一些策略来保存数据, 比如根据时间或更新次数。 数据结构 可以将Redis看做“数据结构服务器”。目前, Redis支 持5种数据结构。
灵活的可扩展性 轻松应对海量数据 维护简单 经济(运行在便宜的PC服务器集群上) 灵活的数据模型
NOSQL分类
键值(Key/Value)存储
例如:Redis
、Memcache
文档数据库
例如:MongoDB、CouchDB
列式数据库
例如:Hadoop、Hbase
MYSQL
REDIS
需要先设计 容量小于硬盘 读写慢 扩展性:分库、分表 持久化
小型系统可以不用,但 是如果要使用Redis,需 要事先规划 容量小于内存 读写快 扩展性:分库、也可 hash分布 持久化
REDIS与MYSQL的比较
REDIS的历史和使用情况
2008年,意大利的一家创业公司Merzia. 推出 了一款基于MySQL的网站实时统计系统,然而 没过多久该公司的创始人便开始对MySQL的性 能感到失望,于是他决定亲自定做一个数据库, 并于2009年开发完成,这个数据库就是Redis。 同一年将Redis开源发布,从2010年起,Redis 的开发工作由VMware主持。 国内如新浪微博、街旁和知乎,国外如GitHub、 暴雪和Instagram,都是Redis的用户。
NOSQL使用国内案例
新浪微博 (MySQL+Redis) 淘宝数据平台(Tair,自己研发的K/V数据库, 开源) 视觉中国 (MongoDB) 优酷 (MongoDB,Hadoop/HBase) 飞信空间 (使用装HandlerSocket插件的 MySQL) 豆瓣社区 (BeansDB ,K/V数据库)
散列类型及操作指令
hash 是一个 string 类型的 field 和 value 的映射表。hash 特别适合用于存储对象。相对于将对象的每个字段存成 单个 string 类型。将一个对象存储在 hash 类型中会占用 更少的内存,并且可以更方便的存取整个对象。省内存 的原因是新建一个 hash 对象时开始是用 zipmap(又称 为 small hash)来存储的。这个 zipmap 其实并不是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据存储开销。如果 field或者 value的大小超出一定限制后,redis会在内部自动将 zipmap替换成正常的hash实现.这个限制可以在配置文件 中指定。 hash-max-zipmap-entries 64 #配置字段最多 64 个 hash-max-zipmap-value 512 #配置 value 最大为 512字节
散列类型及操作指令
hset key field value 设置hash field 为指定值,如果 key 不存在,则创建。 hget key field 获取指定的 hash field。 hmget key filed1....fieldN 获取全部指定的 hash filed。 hmset key filed1 value1 ...... filedN valueN 同时设置 hash 的多个 field。 hincrby key field integer 将指定的 hash filed 加上指定 值。成功返回 hash filed 变更后的值。 hexists key field 检测指定 field 是否存在。 hdel key field 删除指定的 hash field。 hlen key 返回指定 hash 的 field 数量。 hkeys key 返回 hash 的所有 field。 hvals key 返回 hash 的所有 value。 hgetall key 返回 hash 的所有 filed 和 value
字符串类型(string) 散列类型(hash表) 列表类型(list) 集合类型(set) 有序集合类型(zset)
字符串类型及操作指令
string 是最基本的类型,而且 string 类型是二进制安全 的。 redis 的 string 可以包含任何数据。比如 jpg 图片 或者序列化的对象。从内部实现来看其实 string 可以 看作 byte数组,最大上限是 1G 字节。 set key value 设置 key 对应 string 类型的值,返回 1 表 示成功,0 失败。 setnx key value 如果 key 不存在,设置 key 对应 string 类型的值。如果 key 已经存在,返回 0。 get key 获取 key 对应的 string 值,如果 key 不存在返回 nil getset key value 先获取 key 的值,再设置 key 的值。如 果 key 不存在返回 nil。 mget key1 key2 ... keyN 一次获取多个 key 的值,如果 对应 key 不存在,则对应返回 nil。