etcd和redis的比较和日常使用场景

个人观点:etcd的红火来源于kurbernetes用etcd做服务发现,而redis的兴起则来源于memcache缓存本身的局限性。 etcd是一种分布式存储,更强调的是各个节点之间的通信,同步,确保各个节点上数据和事务的一致性, 使得服务发现工作更稳定,本身单节点的写入能力并不强。 redis更像是内存型缓存,虽然也有cluster做主从同步和读写分离, 但节点间的一致性主要强调的是数据,并不在乎事务,因此读写能力很强,qps甚至可以达到10万+ 两者都是k-v存储,但redis支持更多的存储模式,包括KEY,STRING,HMAP,SET,SORTEDSET等等, 因此redis本身就可以完成一些比如排序的简单逻辑。而etcd则支持对key的版本记录和txn操作和client对key的watch,因此适合用做服务发现。 日常使用中,etcd主要还是做一些事务管理类的,基础架构服务用的比较多,容器类的服务部署是其主流。 而redis广泛地使用在缓存服务器方面,用作mysql的缓存,通常依据请求量,甚至会做成多级缓存,当然部分情况下也用做存储型redis做持续化存储。   from:https://www.cnblogs.com/nmap/p/9398346.html

redis 连接字符串,设置密码

<add name="Abp.Redis.Cache" connectionString="127.0.0.1:6379,password=123456"/> 参考:https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Configuration.md   from:https://www.cnblogs.com/lishidefengchen/p/10656327.html

【Docker】解决创建Redis容器没有conf配置文件

序言 这篇文章没有什么知识点,只是为了新伙伴少踩点坑 1. 问题重现 创建容器 2. 解读参数 -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -p: 端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --ip: 为容器制定一个固定的ip --net: 指定网络模式 3. 进入容器查看redis.conf文件 发现是并没有redis.conf文件的,那么这个时候就是新手踩坑阶段了,因为没有系统的学习docker所以会花费很多时间   2. 解决问题 没有配置文件这件事呢!那是因为redis容器里边的配置文件是需要在创建容器时映射进来的 那么就需要删除我们之前创建好的容器,在删除前需要先停止容器后才可以删除 停止容器:docker container stop redis-test 删除容器:docker container rm redis-test 1. 开始重新创建redis容器 docker run -itd  --name  redis-slave  -v /usr/local/redis/redis.conf:/etc/redis.conf -v /root/usr/local/redis/data:/data  --net mynetwork  -p 6381:6379  --ip 172.10.0.3  redis 参数解释: -v /usr/local/redis/redis.conf:/etc/redis.conf:映射配置文件 -v /root/usr/local/redis/data:/data:映射数据目录 那么这个时候就有redis配置文件了   搭建同意的挂载外部配置 上边是在我宿主机有redis的情况下的,那么下来说宿主机没有redis的情况 这里说的映射其实就是挂载外部配置和数据安装 1. 创建docker统一的外部配置文件 mkdir -p docker/redis/{conf,data} 2. 在conf目录创建redis.conf的配置文件 touch /docker/redis/conf/redis.conf 3. redis.conf文件的内容需要自行去下载,网上很多 4. 创建启动容器,加载配置文件并持久化数据 docker run -d --privileged=true -p 6379:6379 -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data --name redis-test redis redis-server /etc/redis/redis.conf --appendonly yes 参数说明: --privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限 -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf:映射配置文件 -v /docker/redis/data:/data:映射数据目录 redis-server /etc/redis/redis.conf:指定配置文件启动redis-server进程 --appendonly yes:开启数据持久化 这里边还有一些概念新手可能会很模糊,后边会进行详解,先知道这么用就好了,深夜了,大家晚安!   from:https://blog.csdn.net/fangkang7/article/details/100642695

docker安装Redis并设置密码

1.搜索镜像

2.拉取镜像

3.创建Redis容器并设置密码

4.备注 为现有的redis创建密码或修改密码的方法: 1.进入redis的容器 docker exec -it 容器ID bash 2.进入redis目录 /usr/local/bin 3.运行命令:redis-cli 4.查看现有的redis密码:config get requirepass 5.设置redis密码config set requirepass ****(****为你要设置的密码) 6.若出现(error) NOAUTH Authentication required.错误,则使用 auth 密码 来认证密码   from:https://www.cnblogs.com/zhangzimo/p/12753563.html

MISCONF Redis is configured to save RDB snapshots, but it is currently not a

开发环境最近遇到了"MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"的问题,服务出现了问题,一看日志是Redis在报这个错误。 查了查网上的资料,解决方案基本都是修改Redis的配置文件,将 stop-writes-on-bgsave-error yes修改为 stop-writes-on-bgsave-error no   这是一个暂时性的解决方法。看了看stackoverflow上的回答,最高赞回答是这样的,如下图: 大概意思是:这是一个快速应急方法,如果你担心你的数据,那就首先检查下bgsave方法为什么会失败。bgsave方法是干什么的呢?咱来看下面这张图: bgsave方法为什么会失败呢?咱们看看大佬的回答 大概意思是(翻译不到位的地方,还请见谅,英文比较菜):在BGSAVE时,Redis会fork一个子进程,把数据保存到硬盘上。你可以通过查看日志来获取BGSAVE失败的原因(Linux系统里Redis日志文件通常是在/var/log/redis/redis-server.log),大多数时候BGSAVE失败的原因是fork进程分配不到内存。更多时候,fork进程分配不到内存是因为跟操作系统的优化相冲突,即使操作系统有足够的内存。(下面一大段就不翻译了,意思是可以Redis官网找到相应的解释,文末会把相关文章链接都缀上)。当然大神也给出了解决方案 Linux系统中,修改/etc/sysctl.conf文件,添加配置: vm.overcommit_memory=1 执行命令,使其生效 sudo sysctl -p /etc/sysctl.conf 参考文章链接: stackoverflow的回答链接 BGSAVE命令解释 redis官网的faq   from:https://blog.csdn.net/u014071875/article/details/103715183

笔记:解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to…

今天重启游戏服务器在连接redis数据库时突然报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error. 究其原因是因为强制把redis快照关闭了导致不能持久化的问题,在网上查了一些相关解决方案,通过stop-writes-on-bgsave-error值设置为no即可避免这种问题。 有两种修改方法,一种是通过redis命令行修改,另一种是直接修改redis.conf配置文件 命令行修改方式示例: 127.0.0.1:6379> config set stop-writes-on-bgsave-error no 修改redis.conf文件:vi打开redis-server配置的redis.conf文件,然后使用快捷匹配模式:/stop-writes-on-bgsave-error定位到stop-writes-on-bgsave-error字符串所在位置,接着把后面的yes设置为no即可。   from:https://blog.csdn.net/qq_31766907/article/details/78715935

Redis服务停止报错解决方案[NOAUTH Authentication required]

Redis服务器设置密码后,使用service redis stop 会出现以下信息: service redis stop Stopping … OK (error) NOAUTH Authentication required. Waiting for Redis to shutdown … Waiting for Redis to shutdown … Waiting for Redis to shutdown … Waiting for Redis to shutdown … Waiting for Redis to shutdown … Waiting for Redis to shutdown … Waiting for Redis to shutdown … Waiting for Redis to shutdown … 出现这样的错误信息,redis 这时是没有停止服务的。可以使用ps -ef | grep redis  查进程号 然后kill 掉,如果在deamon下还需要去删除pid文件,有点繁琐。 解决办法: 用redis-cli 密码登陆(redis-cli -a  password)就OK了。 再用ps -ef | grep redis 可以看到redis进程已经正常退出。 修改redis服务脚本,加入如下所示的红色授权信息即可: vi /etc/init.d/redis $CLIEXEC -a "password" -p $REDISPORT shutdown from:https://www.cnblogs.com/jeffen/p/6068745.html

CENTOS7下安装REDIS

一、安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz

  第二步:解压压缩包 tar -zxvf redis-4.0.6.tar.gz

  第三步:yum安装gcc依赖 yum install gcc

遇到选择,输入y即可   第四步:跳转到redis解压目录下 cd redis-4.0.6

  第五步:编译安装 make MALLOC=libc

  将/usr/local/redis-4.0.6/src目录下的文件加到/usr/local/bin目录 cd src && make install

  二、启动redis的三种方式   先切换到redis src目录下

  1、直接启动redis ./redis-server

  如上图:redis启动成功,但是这种启动方式需要一直打开窗口,不能进行其他操作,不太方便。   按 ctrl + c可以关闭窗口。   2、以后台进程方式启动redis 第一步:修改redis.conf文件 将

  修改为

  第二步:指定redis.conf文件启动 1 ./redis-server /usr/local/redis-4.0.6/redis.conf

  第三步:关闭redis进程 首先使用ps -aux | grep redis查看redis进程

  使用kill命令杀死进程

    3、设置redis开机自启动 1、在/etc目录下新建redis目录 mkdir redis

  2、将/usr/local/redis-4.0.6/redis.conf 文件复制一份到/etc/redis目录下,并命名为6379.conf

  3、将redis的启动脚本复制一份放到/etc/init.d目录下

  4、设置redis开机自启动 先切换到/etc/init.d目录下 然后执行自启命令

  看结果是redisd不支持chkconfig 解决方法: 使用vim编辑redisd文件,在第一行加入如下两行注释,保存退出

  注释的意思是,redis服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。   再次执行开机自启命令,成功

  现在可以直接已服务的形式启动和关闭redis了 启动: service redisd start

  关闭: service redisd stop

    三、参考资料 1、http://blog.csdn.net/zc474235918/article/details/50974483 2、http://blog.csdn.net/gxw19874/article/details/51992125   如果出现如下问题:

  可参考资料:http://blog.csdn.net/luozhonghua2014/article/details/54649295 from:https://www.cnblogs.com/zuidongfeng/p/8032505.html

Redis 避不开的五种数据结构

Redis 中有 5 种数据结构,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),因为使用 Redis 场景的开发中肯定是无法避开这些基础结构的,所以熟练掌握它们也就成了一项必不可少的能力。本文章精要地介绍了 Redis 的这几种数据结构,主要覆盖了它们各自的定义、基本用法与相关要点。 字符串类型 字符串是 Redis 中的最基础的数据结构,我们保存到 Redis 中的 key,也就是键,就是字符串结构的。除此之外,Redis 中其它数据结构也是在字符串的基础上设计的,可见字符串结构对于 Redis 是多么重要。 Redis 中的字符串结构可以保存多种数据类型,如:简单的字符串、JSON、XML、二进制等,但有一点要特别注意:在 Redis 中字符串类型的值最大只能保存 512 MB。 命令 下面通过命令了解一下对字符串类型的操作: 1.设置值

set 命令有几个非必须的选项,下面我们看一下它们的具体说明: EX seconds:为键设置秒级过期时间 PX milliseconds:为键设置毫秒级过期时间 NX:键必须不存在,才可以设置成功,用于添加 XX:键必须存在,才可以设置成功,用于更新 set 命令带上可选参数 NX 和 XX 在实际开发中的作用与 setnx 和 setxx 命令相同。我们知道 setnx 命令只有当 key 不存在的时候才能设置成功,换句话说,也就是同一个 key 在执行 setnx 命令时,只能成功一次,并且由于 Redis 的单线程命令处理机制,即使多个客户端同时执行 setnx 命令,也只有一个客户端执行成功。所以,基于 setnx 这种特性,setnx 命令可以作为分布式锁的一种解决方案。 而 setxx 命令则可以在安全性比较高的场景中使用,因为 set 命令执行时,会执行覆盖的操作,而 setxx 在更新 key 时可以确保该 key 已经存在了,所以为了保证 key 中数据类型的正确性,可以使用 setxx 命令。 2.获取值

3.批量设置值

4.批量获取值

如果有些键不存在,那么它的值将为 nil,也就是空,并且返回结果的顺序与传入时相同。 5.计数

incr 命令用于对值做自增操作,返回的结果分为 3 种情况: 如果值不是整数,那么返回的一定是错误 如果值是整数,那么返回自增后的结果 如果键不存在,那么就会创建此键,然后按照值为 0 自增, 就是返回 1 除了有 incr 自增命令外,Redis 中还提供了其它对数字处理的命令。例如:

6.追加值

append 命令可以向字符串尾部追加值。 7.字符串长度

由于每个中文占用 3 个字节,所以 jilinwula 这个键,返回是字符串长度为 12,而不是 4。 8.设置并返回原值

9.设置指定位置的字符

10.获取部分字符串

时间复杂度 在 Redis 中执行任何命令时,都有相应的时间复杂度,复杂度越高也就越费时间,所以在执行 Redis 中的命令时,如果要执行的命令复杂度越高,就越要慎重。下面是字符串命令时间复杂度类型表: 命令 时间复杂度 set key value O(1) get key O(1) del key O(k) k是键的个数 mset key value O(k) k是键的个数 mget key O(k) k是键的个数 incr key O(1) decr key O(1) incrby key increment O(1) decrby keky increment O(1) incrbyfloat key iincrement O(1) append key value O(1) strlen key O(1) setrange key offset value O(1) getrange key start end O(n) n是字符串长度 内部编码 在 Redis 中字符串类型的内部编码有 3 种: int:8 个字节的长整型 embstr:小于等于 39 个字节的字符串 raw:大于 39 个字节的字符串 哈希类型 大部分语言基本都提供了哈希类型,如 Java 语言中的 Map 类型及 Python 语言中的字典类型等等。虽然语言不同,但它们基本使用都是一样的,也就是都是键值对结构的。例如:

通过下图可以直观感受一下字符串类型和哈希类型的区别: Redis 中哈希类型都是键值对结构的,所以要特别注意这里的 value 并不是指 Redis 中 key 的 value,而是哈希类型中的 field 所对应的 value。 命令 下面我们还是和介绍字符串类型一样,了解一下 Redis 中哈希类型的相关命令。 1.设置值

我们看上图执行的命令知道,hset 命令也是有返回值的。如果 hset 命令设置成功,则返回 1,否则返回 0。除此之外 Redis 也为哈希类型提供了 hsetnx 命令。在前文对字符串的介绍中,我们知道 nx 命令只有当 key 不存在的时候,才能设置成功,同样的,hsetnx 命令在 field 不存在的时候,才能设置成功。 2.获取值

我们看 hget 命令和 get 有很大的不同,get 命令在获取的时候,只要写一个名字就可以了,而 hget 命令则要写两个名字,第一个名字是 key,第二个名字是 field。当然 key 或者 field 不存在时,返回的结果都是 nil。 3.删除 field

hdel 命令删除的时候,也会有返回值,并且这个返回就是成功删除 field 的个数。当 field 不存在时,并不会报错,而是直接返回 0。 4.计算 field 个数

hlen 命令返回的就是当前 key 中 field 的个数,如果 key 不存在,则返回 0。 5.批量设置或获取 field-value

hmset 命令和 hmget 命令分别是批量设置和获取值的,hmset 命令没有什么要注意的,但 hmget 命令要特别注意,当我们获取一个不存在的 key 或者不存在的 field 时,Redis 并不会报错,而是返回 nil。并且有几个 field 不存在,则 Redis 返回几个 nil。 6.判断 field 是否存在

当执行 hexists 命令时,如果当前 key 包括 field,则返回 1,否则返回 0。 7.获取所有 field

8.获取所有 value

9.获取所有的 field-value

hgetall 命令会返回当前 key 中的所有 field-value,并按照顺序依次返回。 10.计数

hincrby 命令和 incrby 命令的使用功能基本一样,都是对值进行增量操作的,唯一不同的就是 incrby 命令的作用域是 key,而 hincrby 命令的作用域则是 field。 11.计算 value 的字符串长度

hstrlen 命令返回的是当前 key 中 field 中字符串的长度,如果当前 key 中没有 field 则返回 0。 时间复杂度 命令 时间复杂度 hset key field value O(1) hget key field O(1) hdel key field [field …] O(k) ,k是field个数 hlen key O(1) hgetall key O(n) ,n是field总数 hmget key field [field …] O(k) ,k是field个数 hmset key field value [field value …] O(k) ,k是field个数 hexists key field O(1) hkeys key O(n) ,n是field总数 hvals key O(n) ,n是field总数 hsetnx key field value O(1) hincrby key field increment O(1) hincrbyfloat key field increment O(1) hstrlen key field O(1) 内部编码 Redis 哈希类型的内部编码有两种,它们分别是: ziplist(压缩列表):当哈希类型中元素个数小于 hash-max-ziplist-entries 配置(默认 512 个),同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现。 hashtable(哈希表):当上述条件不满足时,Redis 则会采用 hashtable 作为哈希的内部实现。 下面我们通过以下命令来演示一下 ziplist 和 hashtable 这两种内部编码。 当 field 个数比较少并且 value 也不是很大时候 Redis 哈希类型的内部编码为 ziplist: 当 value 中的字节数大于 64 字节时(可以通过 hash-max-ziplist-value 设置),内部编码会由 ziplist 变成 hashtable。 当 field 个数超过 512(可以通过 hash-max-ziplist-entries 参数设置),内部编码也会由 ziplist 变成 hashtable。 由于直接手动创建 512 个 field 不方便,为了更好的验证该功能,我将用程序的方式,动态创建 512 个 field 来验证此功能,下面为具体的代码:

列表类型 Redis 中列表类型可以简单地理解为存储多个有序字符串的一种新类型,这种类型除了字符串类型中已有的功能外,还提供了其它功能,如可以对列表的两端插入和弹出元素(在列表中的字符串都可以称之为元素),除此之外还可以获取指定的元素列表,并且还可以通过索引下标获取指定元素等等。下面我们通过下图来看一下 Redis 中列表类型的插入和弹出操作: 下面我们看一下 Redis 中列表类型的获取与删除操作: […]

设置redis访问密码

在服务器上,这里以linux服务器为例,为redis配置密码。 1.第一种方式 (当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,) (1)首先进入redis,如果没有开启redis则需要先开启: [root@iZ94jzcra1hZ bin]# redis-cli -p 6379 127.0.0.1:6379> (2)查看当前redis有没有设置密码: 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "" (3)为以上显示说明没有密码,那么现在来设置密码: 127.0.0.1:6379> config set requirepass abcdefg OK 127.0.0.1:6379> (4)再次查看当前redis就提示需要密码: 127.0.0.1:6379> config get requirepass (error) NOAUTH Authentication required. 127.0.0.1:6379> 2.第二种方式 (永久方式) 需要永久配置密码的话就去redis.conf的配置文件中找到requirepass这个参数,如下配置: 修改redis.conf配置文件 # requirepass foobared requirepass 123   指定密码123 保存后重启redis就可以了   连接redis 1.redis-cli连接redis [root@iZ2ze3zda3caeyx6pn7c5zZ bin]# redis-cli 127.0.0.1:6379> keys * (error) NOAUTH Authentication required. 127.0.0.1:6379> auth 123        //指定密码 OK 127.0.0.1:6379> keys * 1) "a" 2) "cit" 3) "clist" 4) "1" 127.0.0.1:6379>   2.Jedis连接redis java 代码方式 //连接redis服务器,192.168.0.100:6379 jedis = new Jedis("ip", 6379); //权限认证 jedis.auth("password");   配置文件方式 <bean id=”jedisConnectionFactory” class=”org.springframework.data.redis.connection.jedis.JedisConnectionFactory”> <property name=”hostName” value=”${redis.host}” /> <property name=”port” value=”${redis.port}” /> <property name=”password” value=”${redis.pass}” /> </bean>     redis的其他命令。 如果需要关闭redis: [root@iZ94jzcra1hZ bin]# pkill redis 如果需要开启redis: [root@iZ94jzcra1hZ bin]# redis-server & 加&符号的作用是为了让此进程转换为后台进程,不占用shell的服务。   from:https://www.cnblogs.com/756623607-zhang/p/6859540.html

Redis集群搭建与简单使用

介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。 redis 采用 redis-3.2.4 版本。 两台虚拟机都是 CentOS ,一台 CentOS6.5 (IP:192.168.31.245),一台 CentOS7(IP:192.168.31.210) 。 安装过程 1. 下载并解压 1 cd /root/software wget http://download.redis.io/releases/redis-3.2.4.tar.gz tar -zxvf redis-3.2.4.tar.gz 2. 编译安装 1 2 cd redis–3.2.4 make &amp;&amp; make install 3. 将 redis-trib.rb 复制到 /usr/local/bin 目录下 1 2 cd src cp redis–trib.rb /usr/local/bin/ 4. 创建 Redis 节点 首先在 192.168.31.245 机器上 /root/software/redis-3.2.4 目录下创建 redis_cluster 目录; 1 mkdir redis_cluster 在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中 1 2 3 mkdir 7000 7001 7002&lt;br&gt;cp redis.conf redis_cluster/7000 cp redis.conf redis_cluster/7001 cp redis.conf redis_cluster/7002 分别修改这三个配置文件,修改如下内容 1 2 3 4 5 6 7 8 port  7000                                        //端口7000,7002,7003         bind 本机ip                                       //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群 daemonize    yes                               //redis后台运行 pidfile  /var/run/redis_7000.pid          //pidfile文件对应7000,7001,7002 cluster–enabled  yes                           //开启集群  把注释#去掉 cluster–config–file  nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002 cluster–node–timeout  15000                //请求超时  默认15秒,可自行设置 appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志 接着在另外一台机器上(192.168.31.210),的操作重复以上三步,只是把目录改为7003、7004、7005,对应的配置文件也按照这个规则修改即可 5. 启动各个节点 1 2 3 4 5 6 7 8 9 第一台机器上执行 redis–server redis_cluster/7000/redis.conf redis–server redis_cluster/7001/redis.conf redis–server redis_cluster/7002/redis.conf 另外一台机器上执行 redis–server redis_cluster/7003/redis.conf redis–server redis_cluster/7004/redis.conf redis–server redis_cluster/7005/redis.conf 6. 检查 redis 启动情况 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ##一台机器<br>ps -ef | grep redis root      61020      1  0 02:14 ?        00:00:01 redis–server 127.0.0.1:7000 [cluster]     root      61024      1  0 02:14 ?        00:00:01 redis–server 127.0.0.1:7001 [cluster]     root      61029      1  0 02:14 ?        00:00:01 redis–server 127.0.0.1:7002 [cluster]     netstat –tnlp | grep redis tcp        0      0 127.0.0.1:17000             0.0.0.0:*                   LISTEN      61020/redis–server tcp        0      0 127.0.0.1:17001             0.0.0.0:*                   LISTEN      61024/redis–server tcp        0      0 127.0.0.1:17002             0.0.0.0:*                   LISTEN      61029/redis–server tcp        0      0 127.0.0.1:7000              0.0.0.0:*                   LISTEN      61020/redis–server tcp        0      0 127.0.0.1:7001              0.0.0.0:*                   LISTEN      61024/redis–server tcp        0      0 127.0.0.1:7002              0.0.0.0:*                   LISTEN      61029/redis–server 2 4 6 8 10 12      ##另外一台机器 ps –ef | grep redis root       9957      1  0 02:32 ?        00:00:01 redis–server 127.0.0.1:7003 [cluster] root       9964      1  0 02:32 ?        00:00:01 redis–server 127.0.0.1:7004 [cluster] root       9971      1  0 02:32 ?        00:00:01 redis–server 127.0.0.1:7005 [cluster] root      10065   4744  0 02:38 pts/0    00:00:00 grep —color=auto redis netstat –tlnp | grep redis tcp        0      0 127.0.0.1:17003         0.0.0.0:*               LISTEN      9957/redis–server 1 tcp        0      0 127.0.0.1:17004         0.0.0.0:*               LISTEN      9964/redis–server 1 tcp        0      0 127.0.0.1:17005         0.0.0.0:*               LISTEN      9971/redis–server 1 tcp        0      0 127.0.0.1:7003          0.0.0.0:*               LISTEN      9957/redis–server 1 tcp        0      0 127.0.0.1:7004          0.0.0.0:*               LISTEN      9964/redis–server 1 tcp        0      0 127.0.0.1:7005          0.0.0.0:*               LISTEN      9971/redis–server 1 7.创建集群 Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。 1 redis–trib.rb  create  —replicas  1  192.168.31.245:7000 192.168.31.245:7001  192.168.31.245:7002 192.168.31.210:7003  192.168.31.210:7004  192.168.31.210:7005 其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器。 等等,出错了。这个工具是用 ruby 实现的,所以需要安装 ruby。安装命令如下: yum -y install ruby ruby-devel rubygems rpm-build gem install redis 之后再运行 redis-trib.rb 命令,会出现如下提示: 输入 yes 即可,然后出现如下内容,说明安装成功。 8. 集群验证 在第一台机器上连接集群的7002端口的节点,在另外一台连接7005节点,连接方式为 redis-cli -h 192.168.31.245 -c -p 7002  ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。 在7005节点执行命令  set hello world ,执行结果如下: 然后在另外一台7002端口,查看 key 为 hello 的内容, get hello  ,执行结果如下: 说明集群运作正常。 简单说一下原理 redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。 Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。 Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。 需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。 人生没有回头路,珍惜当下。 from:http://www.cnblogs.com/wuxl360/p/5920330.html

超强、超详细Redis数据库入门教程

这篇文章主要介绍了超强、超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 1、【redis是什么】 redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地) 目前,Vmware在资助着redis项目的开发和维护。 2、【redis的作者何许人也】 开门见山,先看照片: 是不是出乎了你的意料,嗯,高手总会有些地方与众不同的。 这位便是redis的作者,他叫Salvatore Sanfilippo,来自意大利的西西里岛,现在居住在卡塔尼亚。目前供职于Pivotal公司。 他使用的网名是antirez,如果你有兴趣,可以去他的博客逛逛,地址是antirez.com,当然也可以去follow他的github,地址是http://github.com/antirez。 3、【谁在使用redis】 Blizzard、digg、stackoverflow、github、flickr … 4、【学会安装redis】 Redis可以到官方网站:http://www.redis.io/download下载 Win版下载地址:https://github.com/dmajkic/redis/downloads 从redis.io下载最新版redis-X.Y.Z.tar.gz后解压 解压Redis的tar包很简单: tar -zxvf redis-x.y.z.tar.gz 这样就在当前目录下新建了一个包含发行版源代码的目录,必须cd进入这个目录以继续服务器的编译。 然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单。 如果make失败,可能是没装装GCC,使用yum install gcc进行安装后再make 如果报错:error: jemalloc/jemalloc.h: No such file or directory,则需要指定MALLOC,如:make MALLOC=libc,这在README 有这个说明,说关于分配器allocator, 如果有MALLOC  这个 环境变量, 会用这个环境变量去建立Redis。而libc 并不是默认的 分配器, 默认的是 jemalloc, 但是如果你没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数,make MALLOC=libc make成功后会在src文件夹下生成几个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump等: 复制代码代码如下: $ find . -type f -executable ./redis-benchmark //用于进行redis性能测试的工具 ./redis-check-dump //用于修复出问题的dump.rdb文件 ./redis-cli //redis的客户端 ./redis-server //redis的服务端 ./redis-check-aof //用于修复出问题的AOF文件 ./redis-sentinel //用于集群管理 然后可以使用make install进行安装,会将redis的指令添加到环境变量中,可在任何目录调用 4、【学会启动redis】 启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件,不指定时会加载默认配置文件: 复制代码代码如下: ./redis-server ../redis.conf 默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。有关作者为什么选择6379作为默认端口,还有一段有趣的典故,英语好的同学可以看看作者这篇博文中的解释。 有关于配置文件的配置说明,详见下文。 一般修改的是:IP,端口,访问密码,日志存放路径,数据库存放路径,日志级别这些 测试启动 redis-cli ping 返回PONG,启动成功。 查看端口是否被占用:netstat–ntlp|grep 6379 5、【停止redis】 关闭服务 redis-cli shutdown 如果非默认端口,可指定端口: redis-cli -p 6380 shutdown 6、【备份方案】 可以增设一台主机作为从节点,执行定时启动,同步,停止脚本 redis-server conf/bak.conf redis-cli save redis-cli shutdown 或直接在服务器上执行持久化操作,然后复制rdb数据文件 7、【使用redis客户端】 我们直接看一个例子: 两种连接方式: 1:window DOS方式:tentel主机IP端口号(默认为127.0.0.1:6379) 2:linux客户端方式:redis-cli主机IP端口号(默认为127.0.0.1 6379) 直接使用redis-cli,连接的是本机,如果是已经配置了IP,或其它机器进行连接,需要指定IP,端口不是默认的需要指定端口,如果加锁设置了密码的,要指定密码,如:redis-cli -h 192.168.1.10 -p 6379 -a mypwd,更多相关的redis-cli参数指令详见下文。 复制代码代码如下: //这样来启动redis客户端 $ ./redis-cli //用set指令来设置key、value 127.0.0.1:6379> set name "roc" OK //来获取name的值 127.0.0.1:6379> get name "roc" //通过客户端来关闭redis服务端 127.0.0.1:6379> shutdown 127.0.0.1:6379> 8、【redis数据结构 – 简介】 redis是一种高级的key:value存储系统,其中value支持五种数据类型: 1.字符串(strings) 2.字符串列表(lists) 3.字符串集合(sets) 4.有序字符串集合(sorted sets) 5.哈希(hashes) 而关于key,有几个点要提醒大家: 1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率; 2.key也不要太短,太短的话,key的可读性会降低; 3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。 9、【redis数据结构 – strings】 有人说,如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。这说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。 我们来看一个最简单的例子: 复制代码代码如下: set mystr "hello world!" //设置字符串类型 get mystr //读取字符串类型 字符串类型的用法就是这么简单,因为是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储。另外,我们还可以通过字符串类型进行数值操作: 复制代码代码如下: 127.0.0.1:6379> set mynum "2" OK 127.0.0.1:6379> get mynum "2" 127.0.0.1:6379> incr mynum (integer) 3 127.0.0.1:6379> get mynum "3" 看,在遇到数值操作时,redis会将字符串类型转换成数值。 由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。 10、【redis数据结构 – lists】 redis的另一个重要的数据结构叫做lists,翻译成中文叫做“列表”。 首先要明确一点,redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH在10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的。 虽然lists有这样的优势,但同样有其弊端,那就是,链表型lists的元素定位会比较慢,而数组型lists的元素定位就会快得多。 lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。我们来看几个例子: 复制代码代码如下: //新建一个list叫做mylist,并在列表头部插入元素"1" 127.0.0.1:6379> lpush mylist "1" //返回当前mylist中的元素个数 (integer) 1 //在mylist右侧插入元素"2" 127.0.0.1:6379> rpush mylist "2" (integer) 2 //在mylist左侧插入元素"0" 127.0.0.1:6379> lpush mylist "0" (integer) 3 //列出mylist中从编号0到编号1的元素 127.0.0.1:6379> lrange mylist 0 1 1) "0" 2) "1" //列出mylist中从编号0到倒数第一个元素 127.0.0.1:6379> lrange mylist 0 -1 1) "0" 2) "1" 3) "2" lists的应用相当广泛,随便举几个例子: 1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。 2.利用LRANGE还可以很方便的实现分页的功能。 3.在博客系统中,每片博文的评论也可以存入一个单独的list中。 11、【redis数据结构 – 集合】 redis的集合,是一种无序的集合,集合中的元素没有先后顺序。 集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。我们来看例子: 复制代码代码如下: //向集合myset中加入一个新元素"one" 127.0.0.1:6379> sadd myset "one" (integer) 1 127.0.0.1:6379> sadd myset "two" (integer) 1 //列出集合myset中的所有元素 127.0.0.1:6379> smembers myset 1) "one" 2) "two" //判断元素1是否在集合myset中,返回1表示存在 127.0.0.1:6379> sismember myset "one" (integer) 1 //判断元素3是否在集合myset中,返回0表示不存在 127.0.0.1:6379> sismember myset "three" (integer) 0 //新建一个新的集合yourset 127.0.0.1:6379> sadd yourset "1" (integer) 1 127.0.0.1:6379> sadd yourset "2" (integer) 1 127.0.0.1:6379> smembers yourset 1) "1" 2) "2" //对两个集合求并集 127.0.0.1:6379> sunion myset yourset 1) "1" 2) "one" 3) "2" 4) "two" 对于集合的使用,也有一些常见的方式,比如,QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。 12、【redis数据结构 – 有序集合】 redis不但提供了无需集合(sets),还很体贴的提供了有序集合(sorted sets)。有序集合中的每个元素都关联一个序号(score),这便是排序的依据。 很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等 老规矩,我们来看几个生动的例子: //新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1: 复制代码代码如下: 127.0.0.1:6379> zadd myzset 1 baidu.com (integer) 1 //向myzset中新增一个元素360.com,赋予它的序号是3 127.0.0.1:6379> zadd myzset 3 360.com (integer) 1 //向myzset中新增一个元素google.com,赋予它的序号是2 127.0.0.1:6379> zadd myzset 2 google.com (integer) 1 //列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。 127.0.0.1:6379> zrange myzset 0 -1 with scores 1) "baidu.com" 2) "1" 3) "google.com" 4) "2" 5) "360.com" 6) "3" //只列出myzset的元素 127.0.0.1:6379> zrange myzset 0 -1 1) "baidu.com" 2) "google.com" 3) "360.com" 13、【redis数据结构 – 哈希】 最后要给大家介绍的是hashes,即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。 hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。 我们来看一个例子: 复制代码代码如下: //建立哈希,并赋值 127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34 OK //列出哈希的内容 127.0.0.1:6379> HGETALL user:001 1) "username" 2) "antirez" 3) "password" 4) "P1pp0" 5) "age" 6) "34" //更改哈希中的某一个值 127.0.0.1:6379> HSET user:001 password 12345 (integer) 0 //再次列出哈希的内容 127.0.0.1:6379> HGETALL user:001 1) "username" 2) "antirez" 3) "password" 4) "12345" 5) "age" 6) "34" 有关hashes的操作,同样很丰富,需要时,大家可以从这里查询。 14、【聊聊redis持久化 – 两种方式】 redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。 RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上; AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。 其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。 如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。 15、【聊聊redis持久化 – RDB】 RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。 redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。 对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。 虽然RDB有不少优点,但它的缺点也是不容忽视的。如果你对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。 16、【聊聊redis持久化 – AOF】 AOF,英文是Append Only File,即只允许追加不允许改写的文件。 如前面介绍的,AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍,就这么简单。 我们通过配置redis.conf中的appendonly yes就可以打开AOF功能。如果有写操作(如SET等),redis就会被追加到AOF文件的末尾。 默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。 如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。 因为采用了追加方式,如果不做任何处理的话,AOF文件会变得越来越大,为此,redis提供了AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。举个例子或许更形象,假如我们调用了100次INCR指令,在AOF文件中就要存储100条指令,但这明显是很低效的,完全可以把这100条指令合并成一条SET指令,这就是重写机制的原理。 在进行AOF重写时,仍然是采用先写临时文件,全部完成后再替换的流程,所以断电、磁盘满等问题都不会影响AOF文件的可用性,这点大家可以放心。 AOF方式的另一个好处,我们通过一个“场景再现”来说明。某同学在操作redis时,不小心执行了FLUSHALL,导致redis内存中的数据全部被清空了,这是很悲剧的事情。不过这也不是世界末日,只要redis配置了AOF持久化方式,且AOF文件还没有被重写(rewrite),我们就可以用最快的速度暂停redis并编辑AOF文件,将最后一行的FLUSHALL命令删除,然后重启redis,就可以恢复redis的所有数据到FLUSHALL之前的状态了。是不是很神奇,这就是AOF持久化方式的好处之一。但是如果AOF文件已经被重写了,那就无法通过这种方法来恢复数据了。 虽然优点多多,但AOF方式也同样存在缺陷,比如在同样数据规模的情况下,AOF文件要比RDB文件的体积大。而且,AOF方式的恢复速度也要慢于RDB方式。 如果你直接执行BGREWRITEAOF命令,那么redis会生成一个全新的AOF文件,其中便包括了可以恢复现有数据的最少的命令集。 如果运气比较差,AOF文件出现了被写坏的情况,也不必过分担忧,redis并不会贸然加载这个有问题的AOF文件,而是报错退出。这时可以通过以下步骤来修复出错的文件: 1.备份被写坏的AOF文件 2.运行redis-check-aof –fix进行修复 3.用diff -u来看下两个文件的差异,确认问题点 4.重启redis,加载修复后的AOF文件 17、【聊聊redis持久化 – AOF重写】 AOF重写的内部运行原理,我们有必要了解一下。 在重写即将开始之际,redis会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。 与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。 当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中。 当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中了。 18、【聊聊redis持久化 – 如何选择RDB和AOF】 […]