一、安装
wget工具下载:yum -y install wget
在CentOS上安装redis:
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz 解压
$ cd redis-5.0.5
$ make 编译
解压redis到指定位置:tar xzf redis-5.0.5.tar.gz -C /usr/local
编译好后显示:
配置在任意地方都可以执行redis命令(src目录下执行命令):make install
二、启动服务
1.前台启动 ./redis-server
启动之后当前窗口停留,不能执行其他操作,ctrl+c退出,服务也停止了
进入src目录下执行redis-server
2.后台启动:./redis-server &
敲击回车可执行其他命令,服务未停止
查看redis进程:ps -ef | grep redis
src下的redis-cli为命令行客户端 ./redis-cli
三、关闭redis
1.使用客户端关闭(推荐此种方式)
切换到src目录,执行./redis-cli shutdown
2.使用kill命令杀掉该进程
使用ps -ef | grep redis
查出进程号,再执行 kill pid
如果kill pid不能执行成功,可以使用kill -9 pid
强制杀掉
或者在客户端里面执行shutdown命令
使用./redis-cli
命令进入客户端,执行shutdown命令
连接指定ip和端口的redis:./redis-cli -h 127.0.01 -p 6379
-h:redis 主机ip (可以指定任意的redis服务器)
-p:端口号(不同的端口表示不同的redis应用)
四、使用图形化界面
安装redis图形化界面,测试连接连不上,因为redis本身有安全策略,默认只有本机可以连接
修改redis配置文件:
①bind ip:绑定ip此行注释
②protected-mode yes:保护模式改为no
使用vi命令修改redis.conf文件,修改前备份,执行cp命令:cp redis.conf redis_bak.conf
修改:
搜索关键字:未按i之前输入/bind
n去到下一个,找到后按i进行编辑修改,修改完毕按esc退出编辑模式,最后:wq保存
修改之后每次重新启动redis时都需要加载该配置文件,否则修改的内容不起作用:./redis-server ../redis.conf &
查看防火墙状态:systemctl status firewalld
五、redis基本命令的使用
1.redis数据结构及对应操作命令
①字符串类型string
存储:set key value
获取:get key
删除:del key
②哈希类型 hash(map格式)
存储:hset key field value
获取:hget key field
-
hget key field
:获取指定的field对应的值 -
hgetall key
:获取所有的field和value
删除:hdel key field
③列表类型 list(linkedlist格式)(可重复)
存储:
-
lpush key value
:将元素加入列表左边 -
rpush key value
:将元素加入列表右边
获取:
-
lrange key start end
:范围获取
删除:
-
lpop key
:删除列表最左边的元素并返回 -
rpop key
:删除列表最右边的元素并返回
④集合类型 set(不可重复)
存储:sadd key value
获取:smembers key
:获取set集合中所有元素
删除:srem key value
⑤有序集合类型 sortedset(有序,不可重复)
存储:zadd key score value
获取:zrange key start end
删除:zrem key value
2.redis常用命令
查询所有间:keys *
(尽量少使用keys * redis是单线程的)
获取键的类型:type key
删除指定key:del key
操作redis:
默认访问第0个库:
查看当前库的key数量:dbsize
所有库的数量在配置文件redis.conf中:
0库不显示数字
删除当前库中的所有数据:flushdb
退出客户端(服务未停止):exit或quit
exist判断一个或多个key在当前库中是否存在 ,返回整数
expire 设置key的存活时间
六、redis持久化
redis是一个内存数据库,当redis服务器重启,,数据会丢失,需要将redis内存中的数据持久化保存到硬盘的文件中。
1.RDB
默认方式,不需要进行配置,默认就使用这种机制
在一定的间隔时间中,检测key的变化情况,然后持久化数据
save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系。
“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照。
“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。
修改后要重启服务器
2.AOP
日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
默认情况下Redis没有开启AOF(append only file)方式的持久化,通过修改redis.conf配置文件中的appendonly参数开启
修改为appendonly yes
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。
修改配置:
# appendfsync always
: 每一次操作都进行持久化
appendfsync everysec
: 每隔一秒进行一次持久化
# appendfsync no
: 不进行持久化
七、Jedis
Redis不仅是使用命令来操作,主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。
在企业中用的最多的就是Jedis,Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis
①依赖:
redis.clients
jedis
3.0.1
org.apache.commons
commons-pool2
2.6.2
②demo:
public class JedisTest {
@Test
public void test1(){
//获取连接
Jedis jedis = new Jedis("120.24.62.115",6379);
jedis.set("myidol","Eason");
jedis.close();
}
}
问题来了:在使用之前,如果是一台崭新的服务器,那么很可能会遇到下面的错误:
猜测可能的原因:
1.本地网络问题
2.本地防火墙端口问题
3.目标服务器网络问题
4.目标服务器防火墙端口问题
5.目标服务器该端口对应的程序是否已启动
6.目标服务器该端口对应的程序设置问题(比如是否运行远程连接)
不用说 都有灵感是防火墙端口问题了 嗯:下面来设置一下:(手把手教学系列)
入和出都设置一下,我这种设置是最不安全的了,但我又懒又笨,就这样了。
设置完服务器端口后执行程序,报下面错误:
解决:Redis服务处于保护模式,需要修改配置文件redis.conf。将NETWORK下的protected-mode yes
修改为protected-mode no
,然后重启服务
但是发现依旧没用。。。
经过我的冥思苦想(其实是去百度了一下),还需要把绑定的ip注释掉(why?我也不懂原理 ,嗯),操作如下:
接着,发现还是没用(笑脸),图样图森破,后面再经过我的一番折腾,原来配置文件修改了,如果不指定,是根本不生效的,还是走的默认的,就是必须在启动的时候同时启动配置文件,修改的才有用:
./redis-server ../redis.conf &
再跑起我的demo,终于好了。
总结一下:
1.允许服务器访问端口
2.修改redis的保护模式protected-mode no
3.注释掉bind 127.0.0.1
4.启动时指定配置文件./redis-server ../redis.conf &
使用java操作redis数据:
①string 数据结构
@Test
public void test2(){
//1. 获取连接 (如果使用空参构造,默认值 "localhost",6379端口)
Jedis jedis = new Jedis();
//存储
jedis.set("username","hcx");
//获取
String username = jedis.get("username");
System.out.println(username);
//可以使用setex()方法存储可以指定过期时间的 key value
jedis.setex("activecode",20,"hello");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对
//3. 关闭连接
jedis.close();
}
②hash 数据结构
@Test
public void test3(){
//获取连接
Jedis jedis = new Jedis();
// 存储hash
jedis.hset("user","name","chaochao");
jedis.hset("user","age","27");
jedis.hset("user","gender","male");
// 获取hash
String name = jedis.hget("user", "name");
System.out.println(name);
// 获取hash的所有map中的数据
Map user = jedis.hgetAll("user");
// keyset
Set keySet = user.keySet();
for (String key : keySet) {
//获取value
String value = user.get(key);
System.out.println(key + ":" + value);
}
//3. 关闭连接
jedis.close();
}
③list 数据结构
@Test
public void test4(){
//1. 获取连接
Jedis jedis = new Jedis();
//2. 操作
// list 存储
jedis.lpush("mylist","a","b","c");//从左边存
jedis.rpush("mylist","a","b","c");//从右边存
// list 范围获取
List mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
// list 弹出
String element1 = jedis.lpop("mylist");//c
System.out.println(element1);
String element2 = jedis.rpop("mylist");//c
System.out.println(element2);
// list 范围获取
List mylist2 = jedis.lrange("mylist", 0, -1);
System.out.println(mylist2);
//3. 关闭连接
jedis.close();
}
④set 数据结构
@Test
public void test5(){
//1. 获取连接
Jedis jedis = new Jedis();
// set 存储
jedis.sadd("myset","a","b","c");
// set 获取
Set myset = jedis.smembers("myset");
System.out.println(myset);
//3. 关闭连接
jedis.close();
}
⑤sortedset 数据结构
@Test
public void test6(){
//1. 获取连接
Jedis jedis = new Jedis();
// sortedset 存储
jedis.zadd("mysortedset",98,"eason");
jedis.zadd("mysortedset",97,"EF");
jedis.zadd("mysortedset",99,"陈奕迅");
// sortedset 获取
Set mysortedset = jedis.zrange("mysortedset", 0, -1);
System.out.println(mysortedset);
//3. 关闭连接
jedis.close();
}
Jedis连接池
jedis.properties
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
JedisPool工具类:
package cn.hcx.jedis.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
JedisPool工具类
加载配置文件,配置连接池的参数
提供获取连接的方法
*/
public class JedisPoolUtils {
private static JedisPool jedisPool;
static{
//读取配置文件
InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties pro = new Properties();
//关联文件
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
//初始化JedisPool
jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));
}
/**
* 获取连接
*/
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
使用:
@Test
public void test8(){
//通过连接池工具类获取
Jedis jedis = JedisPoolUtils.getJedis();
//3. 使用
jedis.set("hello","world");
//4. 关闭 归还到连接池中
jedis.close();;
}
jedis配置详解:
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能够保持idel状态的对象数
redis.pool.minIdle=50
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
#redis服务器的IP
redis.ip=xxxxxx
#redis服务器的Port
redis1.port=6379
八、Spring Data Redis
在SpringData中已经整合了redis了,只需要注入即可使用
①引入依赖:
org.springframework.boot
spring-boot-starter-data-redis
②配置redis:
spring:
redis:
host: xxx.xx.xx.xx
③使用:
@Autowired
private StringRedisTemplate redisTemplate;
public Boolean test(String param) {
/**
* K key:键
* V value:值
* final long timeout:过期时间
* final TimeUnit unit:单位
*/
this.redisTemplate.opsForValue().set("myKey", "123", 5, TimeUnit.MINUTES);
return true;
}
1.五种结构:
- String:等同于java中的,
Map
- list:等同于java中的
Map
> - set:等同于java中的
Map
> - sort_set:可排序的
set
- hash:等同于java中的:
Map
>
2.RedisTemplate基本操作
Spring Data Redis 提供了一个工具类:RedisTemplate。
里面封装了对于Redis的五种数据结构的各种操作:
- redisTemplate.opsForValue() :操作字符串
- redisTemplate.opsForHash() :操作hash
- redisTemplate.opsForList():操作list
- redisTemplate.opsForSet():操作set
- redisTemplate.opsForZSet():操作zset
3.StringRedisTemplate
RedisTemplate在创建时,可以指定其泛型类型:
- K:代表key 的数据类型
- V: 代表value的数据类型
注意:这里的类型是Java中的数据类型,RedisTemplate会自动将Java类型转为Redis支持的数据类型:字符串、字节、二进制等。
RedisTemplate默认会采用JDK自带的序列化(Serialize)来对对象进行转换。生成的数据十分庞大,因此一般会指定key和value为String类型,自己把对象序列化为json字符串来存储。