Web-第二十天 Redis学习【悟空教程】

Web-第二十天 Redis学习【悟空教程

Linux软件安装&Redis学习

今日内容介绍

  • 安装相关软件
  • Linux系统中安装Redis
  • 使用Redis命令操作常用数据结构的数据存取

今日内容学习目标

  • 独立安装jdk
  • 独立安装tomcat
  • 独立安装mysql
  • Linux系统中安装Redis
  • 使用Redis命令操作常用数据结构的数据存取

1 .软件安装

1.1 安装JDK

1.1.1 需求

在linux 下安装JDK,可正常使用java和javac等命令

1.1.2 准备工作

  • 上传需要的所有软件

1.1.3 相关知识点:rpm命令

  • 格式:rpm [参数] [软件]

-v  显示指令执行过程。

-h或--hash  套件安装时列出标记。

-q  使用询问模式,当遇到任何问题时,rpm指令会先询问用户。

-a  查询所有套件。

-i<套件档>或--install<套件档>  安装指定的套件档。

-U<套件档>或--upgrade<套件档> 升级指定的套件档。

-e<套件档>或--erase<套件档>  删除指定的套件。

--nodeps  不验证套件档的相互关联性

常用

安装:rpm -ivh rpm文件【安装】

升级:rpm -Uvh rpm文件【更新】

删除:rpm -e --nodeps 软件名

查看:rpm -qa

1.1.4 JDK的安装

  • 步骤1:查看现有安装的JDK版本

rpm -qa | grep -i java

  • 步骤2:卸载已有软件

rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.i686

rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.i686

  • 步骤3:解压JDK

tar -zxvf jdk-7u72-linux-i586.gz

  • 步骤4:将jdk移动“/usr/local/src/java”

mkdir /usr/local/src/java/

mv jdk1.7.0_72/ /usr/local/src/java/jdk1.7

  • 步骤5:配置系统环境变量

vim /etc/profile

export JAVA_HOME=/usr/local/src/java/jdk1.7

export PATH=$JAVA_HOME/bin:$PATH

  • 步骤6:使配置文件生效,并测试

source /etc/profile

java -version

1.2 安装tomcat

1.2.1 需求

巩固linux基本命令,通过其他主机可以访问tomcat。

1.2.2 分析

  • 上传tomcat
  • 解压tomcat
  • 配置tomcat
  • 测试

1.2.3 实现

  • 步骤1:解压tomcat

tar -zxvf apache-tomcat-7.0.52.tar.gz

  • 步骤2:将tomcat移到“/usr/local/src/java/tomcat下”

mv apache-tomcat-7.0.52 /usr/local/src/java/tomcat7

  • 步骤3:启动并访问tomcat

/usr/local/src/java/tomcat7/bin/startup.sh

  • 通过虚拟机内访问
  • 通过其他计算机不能访问
  • 步骤4:配置防火墙

vim /etc/sysconfig/iptables

  • 运行8080端口远程访问

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

  • 重启启动防火墙服务

service iptables restart

  • 步骤5:通过其他主机访问成功

1.3 安装mysql

1.3.1 需求

巩固linux基本命令,安装mysql,并且可以通过其他主机访问。正常启动关闭mysql,非正常关闭mysql。

1.3.2 分析

  • 上传 “server”和“client”
  • 使用yum卸载旧版本
  • 使用yum安装
  • 启动mysql服务
  • 本地登录
  • 远程登录

1.3.3 相关技术:yum

  • Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

需要联网。

  • 安装:yum install perl
  • 卸载:yum remove mysql
  • 查询系统配置信息:cat /etc/yum.conf

1.3.4 实现

  • 步骤1:查看之前的版本

rpm -qa | grep -i mysql

  • 步骤2:使用yum卸载之前的版本

yum remove mysql-libs-5.1.71-1.el6.i686

  • 确定删除
  • 步骤3:使用yum安装server和client两个程序

yum install MySQL-*.rpm

  • 确定安装程序
  • 步骤4:启动或停止mysql服务

service mysql start

service mysql stop

  • 步骤5:设置root账号密码
    • 安装成功日志提示
  • 设置密码

/usr/bin/mysqladmin -u root password '1234'

  • 步骤6:虚拟机内部,登录mysql

mysql -uroot -p1234

  • 步骤7:远程主机访问,设置防火墙
    • 打开防火墙配置

vim /etc/sysconfig/iptables

  • 设置内容

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

  • 重启服务

service iptables restart

  • 使用mysql语句创建远程登录用户

use mysql;

select user,host,password from user;

create user 'root'@'%' identified by '1234'; #创建用户,并设置密码

grant all on *.* to 'root'@'%' with grant option; #给指定的用户授权

flush privileges; #刷新权限

  • 远程访问成功

mysql -h192.168.137.128 -uroot -p1234 #-hip地址 -u用户名 –p密码

2. Redis概述

2.1什么是NoSQL

NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。

2.2为什么需要NoSQL

随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:

  • 1.High performance - 对数据库高并发读写的需求

web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。

  • 2.Huge Storage - 对海量数据的高效率存储和访问的需求

类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。

  • 3.High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求

在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?

NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

2.3主流NoSQL产品

  • NoSQL数据库的四大分类如下:
    • 键值(Key-Value)存储数据库

相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

典型应用: 内容缓存,主要用于处理大量数据的高访问负载。

数据模型: 一系列键值对

优势: 快速查询

劣势: 存储的数据缺少结构化

  • 列存储数据库

相关产品:Cassandra, HBase, Riak

典型应用:分布式的文件系统

数据模型:以列簇式存储,将同一列数据存在一起

优势:查找速度快,可扩展性强,更容易进行分布式扩展

劣势:功能相对局限

  • 文档型数据库

相关产品:CouchDB、MongoDB

典型应用:Web应用(与Key-Value类似,Value是结构化的)

数据模型: 一系列键值对

优势:数据结构要求不严格

劣势: 查询性能不高,而且缺乏统一的查询语法

  • 图形(Graph)数据库

相关数据库:Neo4J、InfoGrid、Infinite Graph

典型应用:社交网络

数据模型:图结构

优势:利用图结构相关算法。

劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

2.4NoSQL特点

在大数据存取上具备关系型数据库无法比拟的性能优势,例如:

1. 易扩展

  • NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。

2. 大数据量,高性能

  • NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。

3. 灵活的数据模型

  • NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的Web2.0时代尤其明显。

4. 高可用

  • NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。

综上所述,NoSQL的非关系特性使其成为了后Web2.0时代的宠儿,助力大型Web2.0网站的再次起飞,是一项全新的数据库革命性运动。

2.5Redis由来

2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。

Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。

VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

2.6什么是Redis

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:

1.字符串类型

2.散列类型

3.列表类型

4.集合类型

5.有序集合类型。

官方提供测试数据:50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s 。数据仅供参考,根据服务器配置会有不同结果。

2.7redis的应用场景

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
  • 聊天室的在线好友列表。
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜。
  • 网站访问统计。
  • 数据过期处理(可以精确到毫秒)
  • 分布式集群架构中的session分离。

3.Redis安装和使用

redis建议安装在linux服务器上运行测试,本教程使用 linux虚拟机及ssh客户端进行功能测试。

3.1搭建环境

3.1.1虚拟机

虚拟机版本:VMware 10.0.2(VMware-workstation-full-10.0.2-1744117.1398244508 Linux课程已经安装)

3.1.2 Linux系统

Linux版本:CentOS-6.5-i386-bin-DVD1 (CentOS-6.5 32位操作系统)

3.1.3 SSH客户端

远程命令端:SecureCRT 7.3

ftp端:SecureFX 7.3

3.2 CentOS安装Redis

3.2.1 安装环境

redis是C语言开发,安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境。如果没有gcc环境,需要安装gcc:

yum install gcc-c++

如果提示是否下载,输入y。

如果提示是否安装,输入y

3.2.2 Redis安装

  • 步骤1:将Windows下下载的压缩文件上传到Linux下。通过secureCRT进行上传,步骤如下:
  • alt + p
  • put F:/redis-3.0.0.tar.gz
  • 步骤2: 解压文件
  • tar –zxvf redis-3.0.0.tar.gz
  • 步骤3: 编译redis (编译,将.c文件编译为.o文件)
  • 进入解压文件夹,cd redis-3.0.0
  • 执行make

1)如果没有安装gcc,编译将出现错误提示。(如果安装失败,必须删除文件夹,重写解压)

2)安装成功

  • 步骤4: 安装
  • make PREFIX=/usr/local/redis install

安装完后,在/usr/local/redis/bin下有几个可执行文件

redis-benchmark ----性能测试工具

redis-check-aof ----AOF文件修复工具

redis-check-dump ----RDB文件检查工具(快照持久化文件)

redis-cli ----命令行客户端

redis-server ----redis服务器启动命令

  • 步骤5: copy文件

redis启动需要一个配置文件,可以修改端口号等信息。

cp redis.conf /usr/local/redis

3.3 Redis的启动

3.3.1 前端模式启动

直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是启动完成后,不能再进行其他操作,如果要操作必须使用ctrl+c,同时redis-server程序结束,不推荐使用此方法。

/usr/local/redis/bin/redis-server

使用CTRL+ C 停止前端模式

3.3.2 后端模式

  • 修改redis.conf配置文件, daemonize yes 以后端模式启动。

vim /usr/local/redis/redis.conf

  • 启动时,指定配置文件

cd /usr/local/redis/

./bin/redis-server ./redis.conf

  • Redis默认端口6379,通过当前服务进行查看

ps -ef | grep -i redis

3.4 Redis停止

  • 强制结束程序。强行终止Redis进程可能会导致redis持久化数据丢失。

kill -9 31475 #pid需要通过“ps aux | grep -i redis”进行查询

  • 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:(关闭默认端口)

cd /usr/local/redis

./bin/redis-cli shutdown

3.5 Redis使用

3.5.1 连接客户端

在redis的安装目录中有redis的客户端,即redis-cli(Redis Command Line Interface),它是Redis自带的基于命令行的Redis客户端。

redis-cli -h ip地址 -p 端口

默认ip和端口

3.5.2 向Redis服务器发送命令

redis-cli连上redis服务后,可以在命令行发送命令。

  • ping,测试客户端与Redis的连接是否正常,如果连接正常会收到回复PONG
  • set/get,使用set和get可以向redis设置数据、获取数据。
  • del,删除指定key的内容。
  • keys * ,查看当前库中所有的key值

4.Redis的数据结构

4.1 Redis数据结构介绍

  • redis是一种高级的key-value的存储系统,其中value支持五种数据类型。

1.字符串(String)

2.哈希(hash)

3.字符串列表(list)

4.字符串集合(set)

5.有序字符串集合(sorted set)

  • 而关于key的定义呢,需要大家注意的几点:

1.key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低查找效率

2.key不要太短,如果太短会降低key的可读性

3.在项目中,key最好有一个统一的命名规范

4.2 存储string

4.2.1 概述

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

4.2.2 常用命令

4.2.2.1 赋值

  • set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”

4.2.2.2 取值

  • get key:获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回(nil)。
  • getset key value:先获取该key的值,然后在设置该key的值。

4.2.2.3 删除

  • del key :删除指定key

4.2.2.4 数值增减

  • incr key:将指定的key的value原子性的递增1.如果该key不存在,其初始值为0,在incr之后其值为1。如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息。
  • decr key:将指定的key的value原子性的递减1.如果该key不存在,其初始值为0,在incr之后其值为-1。如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息。

4.2.3 扩展命令(了解)

  • incrby key increment:将指定的key的value原子性增加increment,如果该key不存在,器初始值为0,在incrby之后,该值为increment。如果该值不能转成整型,如hello则失败并返回错误信息
  • decrby key decrement:将指定的key的value原子性减少decrement,如果该key不存在,器初始值为0,在decrby之后,该值为decrement。如果该值不能转成整型,如hello则失败并返回错误信息
  • append key value:拼凑字符串。如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value

4.3 存储hash

4.3.1 概述

Redis中的Hash类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

4.3.2 常用命令

4.3.2.1 赋值

  • hset key field value:为指定的key设定field/value对(键值对)。
  • hmset key field value [field2 value2 …]:设置key中的多个filed/value

4.3.2.2 取值

  • hget key field:返回指定的key中的field的值
  • hmget key fileds:获取key中的多个filed的值
  • hgetall key:获取key中的所有filed-vaule

4.3.2.3 删除

  • hdel key field [field … ] :可以删除一个或多个字段,返回值是被删除的字段个数
  • del key :删除整个list

4.3.2.4 增加数字

  • hincrby key field increment:设置key中filed的值增加increment,如:age增加20

4.3.3 自学命令

  • hexists key field:判断指定的key中的filed是否存在
  • hlen key:获取key所包含的field的数量
  • hkeys key :获得所有的key
  • hvals key:获得所有的value

Redis入门

今日内容介绍

  • 通过Java程序操作Redis不同数据

今日内容学习目标

  • 使用Redis命令操作常用数据结构的数据存取
  • 在Java程序中通过Jedis连接Redis

第1章Redis的数据结构

1.4 存储list

1.4.1 概述

在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。

从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。

1.ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢。

2.LinkedList使用双向链接方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快,然后通过下标查询元素时需要从头开始索引,所以比较慢。

3.双向链表中添加数据

4.双向链表中删除数据

1.4.2 常用命令

1.4.2.1 两端添加

  • lpush key values[value1 value2…]:在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
  • rpush key values[value1、value2…]:在该list的尾部添加元素。

1.4.2.2 查看列表

  • lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;也可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…

1.4.2.3 两端弹出

  • lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素。
  • rpop key:从尾部弹出元素。

1.4.2.4 获取列表中元素的个数

  • llen key:返回指定的key关联的链表中的元素的数量。

1.4.3 扩展命令(了解)

  • lpushx key value:仅当参数中指定的key存在时,向关联的list的头部插入value。如果不存在,将不进行插入。
  • rpushx key value:在该list的尾部添加元素
  • lrem key count value:删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。

0)初始化数据

1) 从头删除,2个数字“3”

lrem mylist3 2 3

2) 从尾删除,2个数字“1”

lrem mylist3 -2 1

3) 删除所有数字“2”

lrem mylist3 0 2

  • lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛异常。
  • linsert key before|after pivot value:在pivot元素前或者后插入value这个元素。
  • rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。[循环操作]

1) 将mylist5右端弹出,压入到mylist6左边。

2) 将mylist6右端数据弹出,压入到左端

1.4.4 使用场景

rpoplpush的使用场景

Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。

1.5 存储set

1.5.1 概述

在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。

和List类型不同的是,Set集合中不允许出现重复的元素,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

1.5.2 常用命令

1.5.2.1 添加/删除元素

  • sadd key values[value1、value2…]:向set中添加数据,如果该key的值已有则不会重复添加
  • srem key members[member1、member2…]:删除set中指定的成员

1.5.2.2 获得集合中的元素

  • smembers key:获取set中所有的成员
  • sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在。(无论集合中有多少元素都可以极速的返回结果)

1.5.2.3 集合的差集运算 A-B

  • sdiff key1 key2…:返回key1与key2中相差的成员,而且与key的顺序有关。即返回差集。

(属于A并且不属于B的元素构成的集合)

1.5.2.4 集合的交集运算 A ∩ B

  • sinter key1 key2 key3…:返回交集。

属于A且属于B的元素构成的集合)

1.5.2.5 集合的并集运算 A ∪ B

  • sunion key1 key2 key3…:返回并集。

(属于A或者属于B的元素构成的集合)

1.5.3 扩展命令(了解)

  • scard key:获取set中成员的数量
  • srandmember key:随机返回set中的一个成员
  • sdiffstore destination key1 key2…:将key1、key2相差的成员存储在destination上
  • sinterstore destination key[key…]:将返回的交集存储在destination上
  • sunionstore destination key[key…]:将返回的并集存储在destination上

1.5.4 使用场景

1、可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。

2、充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。

1.6 存储sortedset

1.6.1 概述

Sorted-Set和Set类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Set中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Set中的成员必须是唯一的,但是分数(score)却是可以重复的。

在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Set中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。

例如:游戏排名、微博热点话题等使用场景。

1.6.2 常用命令

1.6.2.1 添加元素

  • zadd key score member score2 member2 … :将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。

1.6.2.2 获得元素

  • zscore key member:返回指定成员的分数
  • zcard key:获取集合中的成员数量

1.6.2.3 删除元素

  • zrem key member[member…]:移除集合中指定的成员,可以指定多个成员。

1.6.2.4 范围查询

  • zrange key start end [withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数。
  • zrevrange key start stop [withscores]:照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
  • zremrangebyrank key start stop: 按照排名范围删除元素
  • zremrangebyscore key min max:按照分数范围删除元素

1.6.3 扩展命令(了解)

  • zrangebyscore key min max [withscores] [limit offset count]:返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]:offset,表明从脚标为offset的元素开始并返回count个成员。
  • zincrby key increment member:设置指定成员的增加的分数。返回值是更改后的分数。
  • zcount key min max:获取分数在[min,max]之间的成员
  • zrank key member:返回成员在集合中的排名。(从小到大)
  • zrevrank key member:返回成员在集合中的排名。(从大到小)

1.6.4 使用场景

1.可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOPTEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。

2.Sorted-Set类型还可用于构建索引数据。

2 keys的通用操作

  • keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys。*表示任意一个或多个字符,?表示任意一个字符
  • del key1 key2…:删除指定的key
  • exists key:判断该key是否存在,1代表存在,0代表不存在
  • rename key newkey:为当前的key重命名
  • expire key :设置过期时间,单位:秒
  • ttl key:获取该key所剩的超时时间,如果没有设置超时,返回-1。如果返回-2表示超时不存在。
  • type key:获取指定key的类型。该命令将以字符串的格式返回。 返回的字符串为string、list、set、hash和zset,如果key不存在返回none。

3 Jedis 入门

3.1 Jedis介绍

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。

在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。

Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

3.2 Java连接Redis

3.2.1 导入jar包

3.2.2 单实例连接

@Test

public void testJedisSingle(){

//1 设置ip地址和端口

Jedis jedis = new Jedis("192.168.137.128", 6379);

//2 设置数据

jedis.set("name", "javahelp");

//3 获得数据

String name = jedis.get("name");

System.out.println(name);

//4 释放资源

jedis.close();

}

3.2.3 连接超时

  • 如果运行上面代码时,抛如下异常

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out

  • 必须设置linux防火墙

vim /etc/sysconfig/iptables

service iptables restart

3.2.4 连接池连接

@Test

public void testJedisPool(){

//1 获得连接池配置对象,设置配置项

JedisPoolConfig config = new JedisPoolConfig();

// 1.1 最大连接数

config.setMaxTotal(30);

// 1.2 最大空闲连接数

config.setMaxIdle(10);

//2 获得连接池

JedisPool jedisPool = new JedisPool(config, "192.168.137.128", 6379);

//3 获得核心对象

Jedis jedis = null;

try {

jedis = jedisPool.getResource();

//4 设置数据

jedis.set("name", "javahelp");

//5 获得数据

String name = jedis.get("name");

System.out.println(name);

} catch (Exception e) {

e.printStackTrace();

} finally{

if(jedis != null){

jedis.close();

}

// 虚拟机关闭时,释放pool资源

if(jedisPool != null){

jedisPool.close();

}

}

}

4 Redis特性

4.1 多数据库

4.1.1 概念

一个Redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。

一个redis实例最多可提供16个数据库,下标从0到15,客户端默认连接第0号数据库,也可以通过select选择连接哪个数据库,如下连接1号库:

连接0号数据库:

4.1.2 将newkey移植到1号库

  • move newkey 1:将当前库的key移植到1号库中

4.2 服务器命令(自学)

  • ping,测试连接是否存活

//执行下面命令之前,我们停止redis 服务器

redis 127.0.0.1:6379> ping

Could not connect to Redis at 127.0.0.1:6379: Connection refused

  • echo,在命令行打印一些内容
  • select,选择数据库。Redis 数据库编号从0~15,可以选择任意一个数据库来进行数据的存取。

当选择16 时,报错,说明没有编号为16 的这个数据库

  • quit,退出连接。
  • dbsize,返回当前数据库中key 的数目。
  • info,获取服务器的信息和统计。
  • flushdb,删除当前选择数据库中的所有key。
  • flushall,删除所有数据库中的所有key。

在本例中我们先查看了一个1 号数据库中有一个key,然后我切换到0 号库执行flushall 命令,结果1 号库中的key 也被清除了,说是此命令工作正常。

4.3 消息订阅与发布

  • subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道
  • psubscribe channel*:批量订阅频道,例:psubscribe s*,订阅以”s”开头的频道
  • publish channel content:在指定的频道中发布消息,如 publish mychat ‘today is a newday’
  • 步骤1:在第一个连接中,订阅mychat频道。此时如果没有人“发布”消息,当前窗口处于等待状态。
  • 步骤2:在另一个窗口中,在mychat频道中,发布消息。
  • 步骤3:再第三个窗口,批量订阅以my开头所有频道。
  • 步骤4:在第二个窗口,分别在“mychat”和“mychat2”发布消息

4.4 redis事务

4.4.1 概念

和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULTI/EXEC/DISCARD/这三个命令是我们实现事务的基石。

4.4.2 redis事务特征

1.在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行

2.和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行。

3.我们可以通过MULTI命令开启一个事务,有关系型数据库开发经验的人可以将其理解为"BEGIN TRANSACTION"语句。在该语句之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行EXEC/DISCARD命令来提交/回滚该事务内的所有操作。这两个Redis命令可被视为等同于关系型数据库中的COMMIT/ROLLBACK语句。

4.在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务器执行。

5.当使用Append-Only模式时,Redis会通过调用系统函数write将该事务内的所有写操作在本次调用中全部写入磁盘。然而如果在写入的过程中出现系统崩溃,如电源故障导致的宕机,那么此时也许只有部分数据被写入到磁盘,而另外一部分数据却已经丢失。Redis服务器会在重新启动时执行一系列必要的一致性检测,一旦发现类似问题,就会立即退出并给出相应的错误提示。此时,我们就要充分利用Redis工具包中提供的redis-check-aof工具,该工具可以帮助我们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复之后我们就可以再次重新启动Redis服务器了。

4.4.3 命令解释

  • multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行EXEC时,这些命令才会被原子的执行,类似与关系型数据库中的:begin transaction
  • exec:提交事务,类似与关系型数据库中的:commit
  • discard:事务回滚,类似与关系型数据库中的:rollback

4.4.4 测试

4.4.4.1 正常执行事务

  • 步骤1:在窗口1,设置num,并获得数据
  • 步骤2:在窗口2,num累加1,并获得数据
  • 步骤3:在窗口1,获得数据
  • 步骤4:在窗口1,开启事务,多次累加数据。
  • 步骤5:在窗口2,获得数据
  • 步骤6:提交事务

127.0.0.1:6379> set num 1

OK

127.0.0.1:6379> get num

"1"

127.0.0.1:6379> get num

"2"

127.0.0.1:6379> multi

OK

127.0.0.1:6379> incr num

QUEUED

127.0.0.1:6379> incr num

QUEUED

127.0.0.1:6379> exec

1) (integer) 3

2) (integer) 4

127.0.0.1:6379>

4.4.4.2 回滚

4.4.4.3 失败命令

5 redis持久化(了解)

5.1 概述

Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。

1.RDB持久化(默认支持,无需配置)

该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。

2.AOF持久化

该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

3.无持久化

我们可以通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了。

4.redis可以同时使用RDB和AOF

5.2 RDB

5.2.1 优势

1.一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2.对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上

3.性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork(分叉)出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

4.相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

5.2.2 劣势

1.如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2.由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟

5.2.3 配置说明Snapshotting

5.2.3.1 快照参数设置

  • save 900 1 #每900秒(15分钟)至少有1个key发生变化,则dump内存快照。
  • save 300 10 #每300秒(5分钟)至少有10个key发生变化,则dump内存快照
  • save 60 10000 #每60秒(1分钟)至少有10000个key发生变化,则dump内存快照

5.2.3.2 保存位置设置

5.3 AOF

5.3.1 优势

1.该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

2.由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

3.如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

4.AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

5.3.2 劣势

1.对于相同数量的数据集而言,AOF文件通常要大于RDB文件

2.根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

5.3.3 配置AOF

5.3.3.1 配置信息

  • always #每次有数据修改发生时都会写入AOF文件
  • everysec #每秒钟同步一次,该策略为AOF的缺省策略
  • no #从不同步。高效但是数据不会被持久化

重写AOF:若不满足重写条件时,可以手动重写,命令:bgrewriteaof

策略的选择:

5.3.3.2 数据恢复演示

1.flushall操作 清空数据库

2.及时关闭redis服务器(防止dump.rdb)。 shutdown nosave

3.编辑aof文件,将日志中的flushall命令删除并重启服务即可

  • 步骤1:开启aop,并设置成总是保存。然后重启redis。
  • 步骤2:在窗口1进行若干操作
  • 步骤3:在窗口1,清空数据库
  • 步骤4:在窗口2,关闭redis
  • 步骤5:修改“appendonly.aof”文件,将最后的命令“flushall”删除
  • 步骤6:在窗口1启动redis,然后查询数据库内容

6 redis使用场景(了解)

1、 取最新N个数据的操作

比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取

(1)使用LPUSH latest.comments <ID>命令,向list集合中插入数据

(2)插入完成后再用LTRIM latest.comments 0 5000命令使其永远只保存最近5000个ID

(3)然后我们在客户端获取某一页评论时可以用下面的逻辑(伪代码)

# 伪代码

FUNCTION get_latest_comments(start, num_items):

id_list = redis.lrange("latest.comments", start, start+num_items-1)

IF id_list.length < num_items

id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")

END

RETURN id_list

END

如果你还有不同的筛选维度,比如某个分类的最新N条,那么你可以再建一个按此分类的List,只存ID的话,Redis是非常高效的。

2、 排行榜应用,取TOP N操作

这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

3、 需要精准设定过期时间的应用

比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把 Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。

4、 计数器应用

Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。

5、 Uniq操作,获取某段时间所有数据排重值

这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。

6、 实时系统,反垃圾系统

通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。

7、 Pub/Sub构建实时消息系统

Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。

8、 构建队列系统

使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。

7 附

1.1 redis.conf 配置详情

Redis 支持很多的参数,但都有默认值。

参数名称

描述

daemonize

默认情况下,redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为yes

pidfile

当Redis 在后台运行的时候,Redis 默认会把pid 文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis 服务时,需要指定不同的pid 文件和端口

bind

指定Redis 只接收来自于该IP 地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项

port

监听端口,默认为6379

timeout

设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接

loglevel

log 等级分为4 级,debug, verbose, notice, 和warning。生产环境下一般开启notice

logfile

配置log 文件地址,默认使用标准输出,即打印在命令行终端的窗口上

databases

设置数据库的个数,可以使用SELECT <dbid>命令来切换数据库。默认使用的数据库是0

save

设置Redis 进行数据库镜像的频率。if(在60 秒之内有10000 个keys 发生变化时){进行镜像备份}else if(在300 秒之内有10 个keys 发生了变化){进行镜像备份}else if(在900 秒之内有1 个keys 发生了变化){进行镜像备份}

rdbcompression

在进行镜像备份时,是否进行压缩

dbfilename

镜像备份文件的文件名

dir

数据库镜像备份的文件放置的路径。这里的路径跟文件名要分开配置是因为Redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中

slaveof

设置该数据库为其他数据库的从数据库

masterauth

当主数据库连接需要密码验证时,在这里指定

requirepass

设置客户端连接后进行任何其他指定前需要使用的密码。警告:因为redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K 次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。

maxclients

限制同时连接的客户数量。当连接数超过这个值时,redis 将不再接收其他连接请求,客户端尝试连接时将收到error 信息。

maxmemory

设置redis 能够使用的最大内存。当内存满了的时候,如果还接收到set 命令,redis 将先尝试剔除设置过expire 信息的key,而不管该key 的过期时间还没有到达。在删除时,将按照过期时间进行删除,最早将要被过期的key 将最先被删除。如果带有expire 信息的key 都删光了,那么将返回错误。这样,redis 将不再接收写请求,只接收get 请求。maxmemory 的设置比较适合于把redis 当作于类似memcached 的缓存来使用。

appendonly

默认情况下,redis 会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。所以redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only 模式之后,redis 会把所接收到的每一次写操作请求都追加到appendonly.aof 文件中,当redis 重新启动时,会从该文件恢复出之前的状态。但是这样会造成appendonly.aof 文件过大,所以redis 还支持了BGREWRITEAOF 指令,对appendonly.aof 进行重新整理。所以我认为推荐生产环境下的做法为关闭镜像,开启appendonly.aof,同时可以选择在访问较少的时间每天对appendonly.aof 进行重写一次。

appendfsync

设置对appendonly.aof 文件进行同步的频率。always 表示每次有写操作都进行同步,everysec 表示对写操作进行累积,每秒同步一次。这个需要根据实际业务场景进行配置

vm-enabled

是否开启虚拟内存支持。因为redis 是一个内存数据库,而且当内存满的时候,无法接收新的写请求,所以在redis 2.0 中,提供了虚拟内存的支持。但是需要注意的是,redis中,所有的key 都会放在内存中,在内存不够时,只会把value 值放入交换区。这样保证了虽然使用虚拟内存,但性能基本不受影响,同时,你需要注意的是你要把vm-max-memory 设置到足够来放下你的所有的key

vm-swap-file

设置虚拟内存的交换文件路径

vm-max-memory

这里设置开启虚拟内存之后,redis 将使用的最大物理内存的大小。默认为0,redis 将把他所有的能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。在生产环境下,需要根据实际情况设置该值,最好不要使用默认的0

vm-page-size

设置虚拟内存的页大小,如果你的value 值比较大,比如说你要在value 中放置博客、新闻之类的所有文章内容,就设大一点,如果要放置的都是很小的内容,那就设小一点。

vm-pages

设置交换文件的总的page 数量,需要注意的是,page table 信息会放在物理内存中,每8 个page 就会占据RAM 中的1 个byte。总的虚拟内存大小 = vm-page-size * vm-pages

vm-max-threads

设置VM IO 同时使用的线程数量。因为在进行内存交换时,对数据有编码和解码的过程,所以尽管IO 设备在硬件上本上不能支持很多的并发读写,但是还是如果你所保存的vlaue 值比较大,将该值设大一些,还是能够提升性能的

glueoutputbuf

把小的输出缓存放在一起,以便能够在一个TCP packet 中为客户端发送多个响应,具体原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yes

hash-max-zipmap-entries

在redis 2.0 中引入了hash 数据结构。当hash 中包含超过指定元素个数并且最大的元素没有超过临界时,hash 将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值

activerehashing

开启之后,redis 将在每100 毫秒时使用1 毫秒的CPU 时间来对redis 的hash 表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis 时不时的对请求有2 毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存

7.1 扩展:启动多个Redis

  • 方法1:启动时指定端口可在一台服务器启动多个Redis进程。(多个Redis实例)

cd /usr/local/redis/bin

./redis-server ./redis.conf --port 6380

  • 方式2:复制redis目录,然后编写redis.conf修改端口【推荐使用】
    • 步骤1:拷贝redis目录

cp -r redis/ redis6380

  • 步骤2:修改redis.conf文件

cd redis6380/

vim redis.conf

  • 步骤3:启动多个redis

cd /usr/local/

./redis/bin/redis-server ./redis/redis.conf

./redis6380/bin/redis-server ./redis6380/redis.conf

ps aux | grep -i redis

  • 关闭指定端口号的Redis

./bin/redis-cli -p 6380 shutdown

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏桥路_大数据

ElasticSearch配置外网访问,开放9200端口

5415
来自专栏BeJavaGod

如何限制用户在某一时间段多次访问接口

要知道,如今很多平台的接口都是可以同时被门户网站,手机端,移动浏览器访问,因为接口是通用的,而为了安全起见,有些接口都会设置一个门槛,那就是限制访问次数,也就是...

3946
来自专栏为数不多的Android技巧

Android Studio你不知道的调试技巧

写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug;那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluat...

861
来自专栏同步博客

Redis构建分布式锁

  为什么要构建锁呢?因为构建合适的锁可以在高并发下能够保持数据的一致性,即客户端在执行连贯的命令时上锁的数据不会被别的客户端的更改而发生错误。同时还能够保证命...

2022
来自专栏腾讯云API

腾讯云 API 最佳实践: 善用幂等性

有些开发者问我云服务器“创建实例”接口有一个参数“ClientToken”不知道有什么作用。本文作一个简单的解答。

4.6K15
来自专栏北京马哥教育

实用 Linux 命令行使用技巧集锦

最近在Quora上看到一个问答题目,关于在高效率Linux用户节省时间Tips。将该题目的回答进行学习总结,加上自己的一些经验,记录如下,方便自己和大家参考。 ...

3698
来自专栏Ryan Miao

Git 工作流的正确打开方式

前言 一直在使用git做版本控制,也一直工作很顺利,直到和别人发生冲突的时候。这才注意到git 工作流并不是那么简单。比如,之前遇到的清理历史。百度到的资料很...

3286
来自专栏铭毅天下

刨根问底 | Elasticsearch 5.X集群多节点角色配置深入详解

1、问题引出 ES5.X节点类型多了ingest节点类型。 针对3个节点、5个节点或更多节点的集群,如何配置节点角色才能使得系统性能最优呢? ? 2、...

4818
来自专栏IT技术精选文摘

RPC原理及实现

1 简介 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明...

8049
来自专栏IT大咖说

饿了么资深Android工程师带你领略Kotlin协程的力量

内容来源:2018 年 6 月 28 日,饿了么资深Android工程师张涛在“droidcon上海2018安卓技术大会”进行《领略kotlin协程的力量》演讲...

5964

扫码关注云+社区

领取腾讯云代金券