目前的互联网应用广泛使用两种方式进行数据存储:关系型数据库 和 NoSQL数据库
关系型数据库是指采用关系型模型来组织数据的数据库,主要用于存储格式化的数据结构,大量传统数据库如:MySQL、Oracle、SQLServer
NoSQL数据库泛指非关系型数据库,主要服务于特定背景的专用数据库,对外提供的是特定的API,而非通用的SQL接口,数据访问更加高效
Redis是开源、高性能的key-value数据库,属于NoSQL数据库
Redis的特点
不仅支持简单的string类型数据,同时还提供list、set、zset、hash等数据结构的存储
支持数据持久化,可以将内存中的数据保存在磁盘中
支持主从(master-slave)模式的数据备份
Linux环境Redis安装及配置
安装虚拟机 安装CentOS-7.0.docx
在虚拟机上安装linux系统 安装vmware.docx
安装Xftp 傻瓜式安装
安装Xshell 傻瓜式安装
Xftp6如何连接虚拟机 Windows与虚拟机之间传输文件
弹出下面界面,这样传输就很方便了
安装Redis
Linux版本的Redis安装包 官网地址是 https://redis.io
打开Xftp软件,并连接虚拟机;将Linux版本的安装包复制至Linux服务器的某目录(如:/home/dxp/anzhuangbao)
在Xftp软件界面中点击如下位置,即可进入Xshell界面
解压redis-6.2.4.tar.gz,在Xshell界面中输入tar -zxvf redis-6.2.4.tar.gz
进入解压之后的redis-6.2.4目录,执行编译和安装命令,如下
进入:cd redis-6.2.4
安装:make PREFIX=/home/dxp/ruanjian/redis-6.2.4 install
PREFIX参数是配置安装时的顶级目录名,一般而言,如果不配置,该选项默认为/user/local,安装后可执行文件默认放在/user/local/bin中,库文件默认放在/user/local/lib中,配置文件默认放在/user/local/etc中,其他的资源文件则放在/user/local/share中,各类文件的放置位置比较分散。上述命令通过配置PREFIX参数,指定将存放各类文件的目录都集中创建在/home/dxp/ruanjian/redis-6.2.4目录中
当出现如下效果时,则表示安装成功
安装过程会根据PREFIX参数的设置,在/home/dxp/ruanjian目录下创建redis-6.2.4/bin目录结构,其中包含与Redis相关的可执行文件。如下图所示,其中redis-server用于启动Redis服务,redis-cli用于启动操作Redis的客户端。
最后,在/home/dxp/ruanjian/redis-6.2.4目录下创建 etc 目录,并将即/home/dxp/anzhuangbao/redis-6.2.4目录下的redis.conf文件复制至其中,此文件为Redis的配置文件
mkdir 创建文件夹的位置/创建文件夹的名称
cp 当前路径下要被复制的文件名称/要复制到指定位置的路径
配置Redis(暂时先不配置)
为了能够更好地使用Redis服务,安装完成后还需要对Redis进行多方面配置
1.设置内存分配策略
在/proc/sys/vm/overcommit_memory 文件中指定内存分配策略。此为可选配置,可根据服务器的实际情况进行设置,可选值包括0、1、2共3种。
命令:echo 1 > /proc/sys/vm/overcommit_memory
执行该命令需要使用root账户
2.开放Redis端口
Redis默认占用6379端口,需要在防火墙中设置开发对此端口的访问。步骤如下
1)编辑防火墙配置文件
命令:vim/etc/sysconfig/iptables
2)添加如下原则
命令:-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
3)重新加载规则
命令:service iptables restart
3.设置Redis配置文件
在安装Redis时,曾将Redis配置文件redis.conf复制至安装位置/etc目录下,编辑此文件中的配置指令可控制Redis运行时行为
命令:vim /home/dxp/ruanjian/redis-6.2.4/etc/redis.conf
进入到编辑页面 先按个a 开始进行输入
完事后按esc键,输入“:wq” 回车
设置Redis服务可以监听的请求IP地址,多个IP地址使用空格分隔
命令:bind 127.0.0.1 ::1
在redis.conf中bind的默认配置为bind 127.0.0.1,表示Redis仅能监听来自本机的IPv4请求,若将其
修改为bind 0.0.0.0 或 使用“#”将bind指令注释掉,则可监听所有IP地址的请求。
如果Redis服务运行于Internet上,则绑定所有IP地址是危险的,建议仅绑定与应用相关的客户端IP地址。如bind 192.168.1.100 10.0.0.1 |
设置Redis监听的端口
使用port配置指令可以设置Redis监听的端口,默认为6379
命令:port 6379
设置Redis是否作为守护进行运行,默认 no
命令:daemonize yes
在redis.conf中该指令默认设置为daemonize no,即在默认情况下,Redis不作为守护进程,而是作为会话进程运行。在这种情况下,执行redis启动命令后不会返回到命令提示符,且不能关闭会话,否则Redis服务会停止。如果需要Redis作为守护进程于后台运行,则将其修改为daemonize yes即可。
设置Redis的日志文件路径,默认"",不生成日志文件
命令:logfile "/home/dxp/ruanjian/redis-6.2.4/log/redis.log"
设置Redis数据库的数量,默认数量为16,对应的dbid范围是0~15;默认情况下一个客户端连接到数据库 0
设置数据库数量命令:databases 16
切换数据库(默认有 0-15)命令:select 0
1. Redis中不同的可选数据库以命名空间的形式管理,数据文件是同一个 2. Redis划分数据库主要用于在必要的情况下分隔同一应用中存储的key(不同数据库中可以使用相同名称的key),而不是为了区分多个应用 |
、
设置Redis的工作目录
设置Redis的工作目录(即Redis的数据文件的存储目录),在redis.conf中默认为 ./,即在Redis安装目录下。可将其修改至其他路径
命令:dir /data/redisdata/
设置Redis的访问密码,默认不需要密码
命令:requirepass 123456
由于Redis的高性能特性,可以在很短的时间内并行尝试大量密码,因此应使用一个高强度的密码
启动Redis
安装好Redis之后,我们就该学习如何启动Redis服务及如何使用Redis自带的客户端连接Redis
1.启动Redis服务
执行Redis安装目录下bin目录中的redis-server命令,启动Redis服务
命令:cd /home/dxp/ruanjian/redis-6.2.4/bin
./redis-server ../etc/redis.conf
命令执行后并未返回命令提示符位置,可知此时Redis是以会话进程而非守护进程方式启动的,即在redis.conf中daemonize指令为no。
若想再次切换到启动命令的会话窗口,使用Ctrl+C组合键可以终止当前命令的执行,Redis服务停止运行并回到命令提示符位置。
只想回到命令提示符位置,不想停止Redis服务
解决方案一:可以打开一个新的会话窗口
解决方案二:修改redis.conf中daemonize指令为yes
通过查看进程信息可以确认Redis服务正在后台运行
查看进行命令:ps -ef | grep :查看进程信息
若想终止Redis服务的进程,可以使用kill命令杀掉该进程
杀进程命令:kill -9 进程ID
2.启动Redis客户端
执行Redis安装目录下bin目录中的redis-cli命令
命令:### 连接到本地Redis服务中dbid为0数据库
cd /home/dxp/ruanjian/redis-6.2.4
./bin/redis-cli
Redis常用命令
auth命令——用于在受密码保护的Redis服务器中请求进行身份认证
语法:auth password
如果password与配置文件中的密码匹配,则服务器将回复OK状态代码 并开接收受命令,否则将返回错误信息
默认访问Redis服务不需要密码,设置密码需在Redis配置文件redis.conf设置Redis的访问密码
set命令——设置key以保存value(string类型)
语法:set key value [ex seconds | px milliseconds] [nx | xx]
参数介绍:
ex:设置指定的过期时间seconds,以秒为单位
px:设置指定的过期时间milliseconds,以毫秒为单位
nx:仅在key不存在时设置该key(只创建、不覆盖)
xx:仅在key已存在时设置该key(只覆盖、不创建)
如果set正确执行,则返回字符串ok。如果因为用户指定了nx或xx选项但未满足条件而未执行set操作,则返回空回复nil,如图
get命令——获取key对应value
语法:get key
如果key不存在,则返回特殊值nil。如果存储在key中的值不是字符串,则返回错误,因为get仅处理字符串值,如图
exists命令——判断指定的key是否存在
从Redis 3.0.3开始,可以指定多个key
语法:exists key1 [key2 ...]
仅指定一个key时,key存在返回1,不存在返回0。指定多个key时,返回存在的key的总数,如图
keys命令——返回和pattern(模式)匹配的所有key
语法:keys pattern
支持的常用模式如下:
h?llo :匹配单个字符,如hello,hallo,hxllo等
h*llo :匹配任意字符,如hllo,heeeello等
h[ae]llo :包含一个指定字符,如hello或hallo
h[^ae]llo:包含除指定字符外的一个字符,如hbllo,hcllo等,不包括hallo和hello
h[a-c]llo :匹配指定范围内的一个字符,如hallo,hbllo,hcllo
如需匹配以上模式中特殊字符,需要使用 \ 转义,如需匹配*字符,应使用\*
del命令——删除指定的key
语法:del key1 [key2 ...]
删除指定的key,返回已删除的key的数量,如果key不存在,则忽略该key
rename命令——将key重命名为newkey
语法:rename key newkey
将key重命名为newkey,当key不存在时返回错误。如果newkey已经存在则会被覆盖(此时rename执行隐式del操作)
expire命令——在key上设置超时时间timeout,时间以秒为单位
语法:expire key timeout
在key上设置超时时间timeout,时间以秒为单位,若key超时将被自动删除。若设置成功则返回1,若key不存在则返回0
注意:
1如果设置一个非正的timeout参数,将导致key被删除
2对已经设置了超时时间的key调用expire命令,该key的超时时间将更新为新值
3删除key或覆盖key的内容会清除该key的超时设置,如del、set操作
4如果使用rename命令重命名key,则相关的剩余生存时间将转移到新key
ttl命令——以秒为单位返回key的剩余生存时间
语法:ttl key
Redis 2.8及以上版本,key未设置超时时间(即永久有效)返回-1,key不存在(或已超时而被删除)返回-2。
Redis 2.6及以下版本,未设置超时时间和key不存在均返回-1
persist命令——删除key上现有的超时设置,使key变为永久有效
语法:persist key
如果超时设置被删除则返回1;
如果key不存在或没有关联的超时设置则返回0
select命令——用于选择具有指定dbid的Redis逻辑数据库
语法:select dbid 例如select 2
flushdb命令——删除当前所选数据库中的所有key
语法:flushdb
flushall命令——删除所有现有数据库中的所有key,而不仅仅是当前选定的数据库
语法:flushall
quit命令——要求服务器关闭连接
语法:quit
127.0.0.1:6379>shutdown
not connected>exit
Redis图形化客户端
除了可以使用Xshell命令行,还可以使用图形化客户端操作Redis
1.修改redis.conf,bind 0.0.0.0 允许所有客户端访问
vim /home/dxp/ruanjian/redis-6.2.4/etc/redis.conf
2.切换root,su root即可切换,执行 iptables -A INPUT -ptcp --dport 6379 -j ACCEPT
3.关闭防火墙
firewall-cmd --state #查看默认防火墙状态(关闭后显示not running,开启后显示running)
systemctl stop firewalld.service #停止防火墙
systemctl disable firewalld.service #禁止防火墙开机启动
service iptables restart #重新启动防火墙
4.启动redis,使用客户端连接就可以
windows环境Redis安装及配置
windows版的Redis可以从GitHub上获取,其发行版的下载地址为 Releases · microsoftarchive/redis · GitHub ,可以选择 mis格式的安装版 或 zip格式的解压缩版
windows版的Redis目录结构如图:
打开一个cmd窗口,使用cd命令切换到Redis安装目录下
redis-server.exe redis.windows.conf
如果想方便的话,可以把Redis的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个redis.windows.conf可以省略;如果省略,会启用默认的。输入之后。会显示如下界面:
这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。
切换到redis目录下运行
redis-cli.exe -h 127.0.0.1 -p 6379
在java应用中访问Redis
若想在应用中访问Reids,就需要在应用中实现Redis客户端的功能。对于目前主流的几种开发语言,都有多种Redis客户端组件可供选择,Jedis就是一个非常受推荐的小巧而强大的面向java语言的Redis客户端。
获取所需组件
可以在 http://search.maven.org 网站上搜索Jedis的不同版本进行下载
Jedis的使用思路
在Jedis中,封装了Redis访问API的核心类是Jedis类。
多线程环境下,不应使用同一个Jedis实例,因为单个Jedis实例不是线程安全的;
应使用JedisPool,它是一个线程安全的网络连接池。
创建JedisPool所需设置的参数可以通过JedisPoolConfig类进行封装。
JedisPoolConfig:连接池配置对象
maxTotal:最大活动连接数,默认为8。-1表示不限制
maxIdle:最大空闲连接数,默认为8
minIdle:最小空闲连接数,默认为0
maxWaitMillis:从池中获取一个资源时的最大等待时间,单位是毫秒,-1表示永不超时
testOnBorrow:在从池中获取一个资源时,是否提前进行验证操作
JedisPool:连接池对象
Jedis:封装Redis访问API的核心类
演示案例:
1.构建JedisPoolConfig 及 JedisPool
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisDemo {
private static JedisPool jedisPool;
static {
//创建并设置连接池配置对象
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(50);//连接池最大连接数,默认为8
config.setMaxIdle(10);//连接池中的最大空闲连接,默认为8
config.setMinIdle(7);//连接池中的最小空闲连接,默认为0
config.setMaxWaitMillis(1000);//获取资源的等待时间
config.setTestOnBorrow(true);//获取资源时是否验证资源的有效性
//创建jedis连接池
jedisPool=new JedisPool(
config,//连接池配置对象
"127.0.0.1",//Redis服务器地址
6379,//Redis服务端口号
10000,//连接超时时间,单位为毫秒,默认为2000ms
"123456",//密码
0//数据库索引
);
}
public void destroy() {
if (!(jedisPool == null || jedisPool.isClosed()))
jedisPool.close(); // 关闭连接池
}
}
2.在上面代码的基础上完善JedisAPI类的定义,增加操作Redis所需的方法
/**
* 将字符串value设置为key的值
* @param key
* @param value
* @return
*/
public boolean set(String key, String value) {
Jedis jedis=null;
try {
jedis=jedisPool.getResource();//从池中获取Jedis实例
jedis.set(key,value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
}
/**
* 将字符串value设置为key的值,并设置以秒为单位的过期时间
* @param key
* @param seconds 有效期
* @param value
* @return
*/
public boolean set(String key, int seconds, String value) {
Jedis jedis=null;
try {
jedis=jedisPool.getResource();//从池中获取Jedis实例
jedis.setex(key,seconds,value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
}
/**
* 判断指定的key是否存在,如果存在返回true;不存在返回false
* @param key
* @return
*/
public boolean exist(String key) {
Jedis jedis=null;
try {
jedis=jedisPool.getResource();//从池中获取Jedis实例
return jedis.exists(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
}
/**
* 获取key对应的value
* @param key
* @return
*/
public String get(String key) {
Jedis jedis=null;
String value=null;
try {
jedis=jedisPool.getResource();//从池中获取Jedis实例
value=jedis.get(key);
} catch (Exception e) {
e.printStackTrace();
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
return value;
}
/**
* 以秒为单位返回key的剩余生存时间
* Redis 2.8及以上版本,key未设置超时时间(即永久有效)返回-1,key不存在(或已超时而被删除)返回-2。
* Redis 2.6及以下版本,未设置超时时间和key不存在均返回-1
* @param key
* @return
*/
public Long ttl(String key) {
Jedis jedis=null;
long num=(long)-2;
try {
jedis=jedisPool.getResource();//从池中获取Jedis实例
num= jedis.ttl(key);
} catch (Exception e) {
e.printStackTrace();
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
return num;
}
/**
* 删除指定的key
* @param key
*/
public void delete(String key) {
Jedis jedis=null;
try {
jedis=jedisPool.getResource();//从池中获取Jedis实例
jedis.del(key);
} catch (Exception e) {
e.printStackTrace();
}finally {
//返还到连接池
if(jedis!=null){
jedis.close();
}
}
}
当Jedis类的实例使用完毕后,务必调用其close方法,将其释放回池中
3.通过Junit对上述功能进行测试
import com.msds.demo.JedisDemo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestJedis {
/*private JedisDemo jedisDemo;
@Before
public void startUp(){
jedisDemo=new JedisDemo();
}
@After
public void tearDown(){
if(jedisDemo!=null){
jedisDemo.destroy();
}
}
@Test
public void test01(){
System.out.println(jedisDemo.set("one","oneValue"));
}*/
@Test
public void test02(){
JedisDemo jedisDemo=new JedisDemo();
System.out.println(jedisDemo.set("one","oneValue"));
if(jedisDemo!=null){
jedisDemo.destroy();
}
}
}
安装虚拟
CentOS
用户名:dxp
密码:123456