1.redis简介
关于关系型数据库和nosql数据库:关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库。
nosql数据库优点:性能优于普通数据库,安全性低于普通数据库在实际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。
redis就是nosql数据库的一种。
2>redis的安装
1)安装redis编译的c环境,yum install gcc-c++
2)将redis-2.6.16.tar.gz上传到Linux系统中
3)解压到/usr/local下 tar -xvf redis-2.6.16.tar.gz -C /usr/local
4)进入redis-2.6.16目录 使用make命令编译redis
5)在redis-2.6.16目录中 使用make PREFIX=/usr/local/redis install命令安装redis到/usr/local/redis中
6)拷贝redis-2.6.16中的redis.conf到安装目录redis中
2.redis的启动与关闭
前端启动:在redis的安装目录bin下直接启动redis-server
[root@localhost bin]# ./redis-server
后台启动:把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下,然后修改redis.conf配置文件(daemonize 改成 yes)
[root@localhost bin]# ./redis-server redis.conf
查看redis进程:
[root@localhost bin]# ps aux|grep redis
结束redis进程:
kill -9 进程的pid(加-9代表强制关闭,可不加)
2>启动redis客户端:
#默认连接localhost运行在6379端口的redis服务。
[root@localhost bin]# ./redis-cli
远程连接其他服务器上的客户端:
[root@localhost bin]# ./redis-cli -h 192.168.25.153 -p 6379
-h:连接的服务器的地址
-p:服务的端口号
关闭redis客户端
[root@localhost bin]# ./redis-cli shutdown
3.redis的五种数据库类型
Redis中所有的数据都是字符串,所有的数据储存格式都是Key - Value。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据。
String(做缓存)、Hash(做缓存)、List(有序可重复)、Set(无需不重复)、SortedSet(有序不重复)
1>String:key-value(做缓存),常用数据类型
存值:set key名 value值
取值:get key名
自增:incr key名
自减:decr key名
删除:del key名
查看所有key: keys *
2>Hash:数据格式key-{key value,key value}(做缓存),相当于一个key对于一个map,map中还有key-value,使用hash对key进行归类,常用数据类型
存值: hset hash名 key名 value值, hset hash名 key名2 value值2
127.0.0.1:6379> hset myhash naem admin
127.0.0.1:6379> hset myhash age 18
取值:hget hash名 key名, hset hash名 key名2
127.0.0.1:6379> hget myhash name
127.0.0.1:6379> hget myhash age
获取指定hash中所有的key-value:hgetall hash名
127.0.0.1:6379> hgetall myhash
3>List:有顺序可重复
从左侧存值:lpush list名 值1 值2 值3 值4,从右侧:rpush list名 值1 值2 值3 值4
127.0.0.1:6379> lpush mylist a c b d
从左侧取值:lrange list名 0 -1,
127.0.0.1:6379> lrange mylist 0 -1
从左侧添加:lpushx key value
从右侧添加:rpushx key value
获取左侧第一个:lpop key
获取右侧第一个:rpop key
4>Set:无序不重复
存值:sadd key value1、value2
取值:smembers key
删除:srem key value
获取长度:scard key
差集:sdiff sdiff key1 key2
并集:sunion key1 key2
交集:sinter key1 key2
5>SortedSet:有序不重复,性能最低
存值:zadd key score member score2 member2
取值:zcount key min max(min max之间的数)
长度:zcard key
4redis的持久化
Redis的所有数据都是保存到内存中的。
Rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案。
aof形式:append only file。把所有对redis数据库操作的命令,增删改操作的命令。保存到文件中。数据库恢复时把所有的命令执行一遍即可。
2>Rdb配置:在redis.conf配置文件中配置。
如果每秒有一个key改变了,那么每九百秒保存一次数据到磁盘
如果每秒有十个key改变了,那么每三百秒保存一次数据到磁盘
如果每秒有一万个key改变了,那么每六十秒保存一次数据到磁盘
3>aof配置
这样数据便会保存到appendonly.aof文件中(bin目录下)
5.redis集群
redis集群的架构图:假设五个redis服务器有一个出错了,其他四个会进行投票,超过半数就说明该服务器出错,所以redis集群最少为三个redis服务器,每个服务器还要有一个备份服务器(也就是需要六个redis服务器)
2>架构细节:
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
自己搭建集群:在一台linux服务器上面复制六份redis,然后修改他们的端口号和配置文件中cluster-enable yes(了解)
3>集群的使用:
六个redis中的任意一个redis-cli都可以连接集群,-c表示连接集群
[root@localhost redis-cluster]# redis01/redis-cli -p 7002 -c
6.Jedis的使用(划重点)
单机普通方式使用jedis:
@Test
public void testJedis(){
//第一步:创建一个jedis对象,需要指定服务端ip及端口
Jedis jedis = new Jedis("192.168.25.131",6379);
//第二步:使用jedis对象操作数据库,每一个redis命令对应一个方法
String str = jedis.get("num");
//第三步:打印结果
System.out.println(str);
//第四步:关闭jedis
jedis.close();
}
单机使用JedisPool连接池:
@Test
public void testJedisPool(){
// 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
JedisPool jedisPool = new JedisPool("192.168.25.131",6379);
// 第二步:从JedisPool中获得Jedis对象。
Jedis jedis = jedisPool.getResource();
// 第三步:使用Jedis操作redis服务器。
jedis.set("name", "admin");
String str = jedis.get("name");
System.out.println(str);
// 第四步:操作完毕后关闭jedis对象,连接池回收资源。
jedis.close();
// 第五步:关闭JedisPool对象。
jedisPool.close();
}
连接Redis集群:
@Test
public void testJedisCluster(){
// 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
Set<HostAndPort> set = new HashSet<>();
set.add(new HostAndPort("192.168.25.131", 7001));set.add(new HostAndPort("192.168.25.131", 7002));set.add(new HostAndPort("192.168.25.131", 7003));
set.add(new HostAndPort("192.168.25.131", 7004));set.add(new HostAndPort("192.168.25.131", 7005));set.add(new HostAndPort("192.168.25.131", 7006));
JedisCluster jedisCluster = new JedisCluster(set);
// 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
jedisCluster.set("admin", "123456");
String str = jedisCluster.get("admin");
// 第三步:打印结果
System.out.println(str);
// 第四步:系统关闭前,关闭JedisCluster对象。
jedisCluster.close();
}
7.redis的开发使用
使用缓存缓存:
//查询缓存,如果存在直接return缓存
try {
String json = jedisClient.hget(CONTENT_LIST, cid+"");
if(StringUtils.isNoneBlank(json)){
List<TbContent> jsonToList = JsonUtils.jsonToList(json, TbContent.class);
return jsonToList;
}
} catch (Exception e) {
e.printStackTrace();
}
添加缓存:
//将数据放入redis缓存中
try {
jedisClient.hset(CONTENT_LIST, cid+"", JsonUtils.objectToJson(list));
//设置过期时间,单位s
jedisClient.expire(CONTENT_LIST, 3600);
} catch (Exception e) {
e.printStackTrace();
}