Java 之SpringData Redis快速入门 以及( Redis快速入门安装和使用)
Posted 蓝盒子itbluebox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 之SpringData Redis快速入门 以及( Redis快速入门安装和使用)相关的知识,希望对你有一定的参考价值。
一、Redis快速基本概念和安装
完成了商品的详情展示,下一步自然是购物了。不过购物之前要完成用户的注册和登录等业务,我们需要使用到Redis技术,—起来回顾下。
1、NoSQL
Redis是目前非常流行的一款NoSql数据库。
什么是NoSQL
NoSQL 简介
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
常见的NoSql产品
2、Redis的介绍和安装
(1)介绍
官网:https://redis.io/
速度很慢,几乎进去不去啊。
中文网站:http://www.redis.cn/
有部分翻译的官方文档,英文差的同学的福音
Redis 简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,
同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及
Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,
意思就是要么成功执行要么失败完全不执行。
单个操作是原子性的。多个操作也支持事务,即原子性,
通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,
这是一个不同于其他数据库的进化路径。
Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,
所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。
在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,
在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。
同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
(2)安装Redis
1)将Redis上传到虚拟机当中并解压
将目录路径切换到压缩包放的位置
tar zxvf redis-4.0.9.tar.gz
切换到解压后的Redis目录当中
cd redis-4.0.9
执行安装命令
make & make install
修改配置文件
vim redis.conf
将这个注释掉(注意有两个这个上面的默认已经注释掉了,下面这个需要手动注释,如果不注释就只能本地访问)
保护模式设置关闭
保存退出
开启端口号
iptables -A INPUT -ptcp --dport 6379 -j ACCEPT
service iptables save
2)启动redis
redis-server redis.conf
启动成功
终止运行
Ctrl+C
使用后台启动
修改配置文件
vim redis.conf
保存退出
再次启动
redis-server redis.conf
启动成功
3)链接Redis
redis-cli
链接成功
输入
ping
返回
3、设置开机启动
(1)先修改redis的安装目录的名称
停止redis
killall redis-server
修改redis的安装目录名称
mv redis-4.0.9 redis
(2)输入命令,新建文件
vim /etc/init.d/redis
输入下面内容:
#!/bin/sh
# chkconfig: 2345 90 10
# description: Redis is a persistent key-value database
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis.pid
CONF="/usr/local/leyou/redis/redis.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$REDIS_CLI -p $REDISPORT SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
然后保存退出
注意:以下信息需要根据安装目录进行调整:
EXEC=/usr/local/bin/redis-server # 执行脚本的地址
REDIS_CLI=/usr/local/bin/redis-cli # 客户端执行脚本的地址
PIDFILE=/var/run/redis.pid # 进程id文件地址
CONF="/usr/local/src/redis-3.0.2/redis.conf" #配置文件地址
(3)设置权限
chmod 755 /etc/init.d/redis
(4)启动测试
/etc/init.d/redis start
启动成功会提示如下信息:
Starting Redis server...
Redis is running...
(5)设置开机自启动
chkconfig --add /etc/init.d/redis
chkconfig redis on
(6)重新启动redis
redis-server redis.conf
二、Redis指令
1、通过help命令
可以让我们查看到Redis的指令帮助信息∶
在 help后面跟上空格,然后按tab键,会看到Redis对命令分组的组名:
主要包含:
- @generic:通用指令
- @string:字符串类型指令
- @list:队列结构指令
- @set: set结构指令
- @sorted_set:可排序的set结构指令
- @hash: hash结构指令
其中除了 @generic以为的,对应了Redis中常用的5种数据类型:
- String:等同于java中的,
Map<String,String>
- list:等同于java中的
Map<String,List<String>>
- set:等同于java中的
Map<String,Set<String>>
- sort_set:可排序的set
- hash:等同于java中的:
Map<String,Map<String,String>>
可见,Redis中存储数据结构都是类似java的map类型。
Redis不同数据类型,只是 'map’的值的类型不同。
2、通用指令
(1)keys
获取符合规则的键名列表。
- 语法:keys pattern
示例:keys *
(查询所有的键)
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> set age 123
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379>
生产环境当中一定要禁用keys *
(2)exists
判断一个键是否存在,如果存在返回整数1,
- 语法:
EXISTS key
- 示例:
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists hhh
(integer) 0
127.0.0.1:6379> exists hhh
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> exists gae
(integer) 0
127.0.0.1:6379> exists age
(integer) 1
127.0.0.1:6379>
(3)del
DEL:删除key,可以删除—个或多个key
- 语法:DEL key [key …]
- 示例:
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> del hhh
(integer) 0
127.0.0.1:6379> exists name
(integer) 0
(4)select(切换库)
切换到别的库就看不到刚刚 创建的key和value
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
redis默认有16个库(0-15)默认就是在0号库
(5)expire
语法:
EXPIRE key seconds
- 作用:设置key的过期时间,超过时间后,清除(默认是永远不会清除)
- 返回值:
-
- 如果成功设置过期时间,返回1。
-
- 如果key不存在或者不能设置过期时间,返回0
(7)TTL
TTL:查看一个key的过期时间·语法:TTL key
- 返回值:
- 返回剩余的过期时间
-
- -1二列永不过期
-
- -2:已过期或不存在·示例:
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> EXPIRE name 10
(integer) 1
127.0.0.1:6379> TTL name
(integer) 6
127.0.0.1:6379> TTL name
(integer) 2
127.0.0.1:6379> TTL name
(integer) 1
127.0.0.1:6379> TTL name
(integer) 0
127.0.0.1:6379> TTL name
(integer) -2
127.0.0.1:6379>
-2代表死亡
(8)persist
- 语法
persister key
- 作用
移除给定key的生存时间,将这个key 从带生存时间 key转换成一个不带生存时间、永不过期的key .
3、字符串指令
字符串结构,其实是Redis中最基础的K-V结构其键和值都是字符串。
类似Java的Map<String,String>
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。可以存储JSON化的对象、字节数组等。一个字符串类型键允许存储的数据最大容量是512MB。
下表列出了常用的 redis 字符串命令:
序号 | 命令及描述 |
---|---|
1 | SET key value 设置指定 key 的值 |
2 | GET key 获取指定 key 的值。 |
3 | GETRANGE key start end 返回 key 中字符串值的子字符 |
4 | GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
5 | GETBIT key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
6 | MGET key1 [key2..] 获取所有(一个或多个)给定 key 的值。 |
7 | SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
8 | SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
9 | SETNX key value 只有在 key 不存在时设置 key 的值。 |
10 | SETRANGE key offset value 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
11 | STRLEN key 返回 key 所储存的字符串值的长度。 |
12 | MSET key value [key value ...] 同时设置一个或多个 key-value 对。 |
13 | MSETNX key value [key value ...] 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
14 | PSETEX key milliseconds value 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
15 | INCR key 将 key 中储存的数字值增一。 |
16 | INCRBY key increment 将 key 所储存的值加上给定的增量值(increment) 。 |
17 | INCRBYFLOAT key increment 将 key 所储存的值加上给定的浮点增量值(increment) 。 |
18 | DECR key 将 key 中储存的数字值减一。 |
19 | DECRBY key decrement key 所储存的值减去给定的减量值(decrement) 。 |
20 | APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。 |
基本的存取命令
自增长
自减
批量增
批量获取
4、字符串指令
Redis的Hash结构类似于Java中的Map<String,Map<String,String>>
,
键是字符串,值是另一个映射。
结构如图:
这里我们称键为key,字段名为hKey,字段值为hValue
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK 127.0.0.1:6379> HGETALL runoobkey 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000"
在以上实例中,我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。
下表列出了 redis hash 基本的相关命令:
序号 | 命令及描述 |
---|---|
1 | HDEL key field1 [field2] 删除一个或多个哈希表字段 |
2 | HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。 |
3 | HGET key field 获取存储在哈希表中指定字段的值。 |
4 | HGETALL key 获取在哈希表中指定 key 的所有字段和值 |
5 | HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。 |
6 | HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
7 | HKEYS key 获取所有哈希表中的字段 |
8 | HLEN key 获取哈希表中字段的数量 |
9 | HMGET key field1 [field2] 获取所有给定字段的值 |
10 | HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
11 | HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。 |
12 | HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。 |
13 | HVALS key 获取哈希表中所有值。 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。 |
(1)HSET和HGET以及HGETALL
127.0.0.1:6379> hset user:123 name "Rost"
(integer) 1
127.0.0.1:6379> hset user:123 age 21
(integer) 1
127.0.0.1:6379> hget user:123 name
"Rost"
127.0.0.1:6379> hget user:123 age
"21"
127.0.0.1:6379> hgetAll user:123
1) "name"
2) "Rost"
3) "age"
4) "21"
(2)HKEYS
·介绍
HKEYS key
获取所有哈希表中的字段
示例:
127.0.0.1:6379> HKEYS user:123
1) "name"
2) "age"
127.0.0.1:6379> HVALS user:123
1) "Rost"
2) "21"
(3)HDEL(删除)
如果直接使用del会删除全部的内容
三、SpringDataRedis
之前,我们使用Redis都是采用的Jedis客户端,不过既然我们使用了SpringBoot,为什么不使用Spring对Redis封装的套件呢?
Spring Data Redis 项目通过使用键值样式数据存储将核心 Spring 概念应用于解决方案的开发。我们提供了一个“模板”作为发送和接收消息的高级抽象。您可能会注意到与 Spring Framework 中的 JDBC 支持的相似之处。
1、创建一个新的SpringBoot项目用于测试
修改pom.xml当中的SpringBoot版本
修改配置文件
在测试类当中
2、RedisTemplate 基本操作
package com.itzheng.demo.redisdemo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisDemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void contextLoads() {
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作HASH
redisTemplate.opsForList();//操作List
redisTemplate.opsForSet();//操作Set
redisTemplate.opsForZSet();//操作ZSet
}
}
其它一些通用命令,如del,可以通过redisTemplate.xx()来直接调用。
3、StringRedisTemplate
StringRedisTemplate与RedisTemplate区别点
两者的关系是StringRedisTemplate继承RedisTemplate。
两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
其实他们两者之间的区别主要在于他们使用的序列化类:
RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。
StringRedisTemplate使用的是StringRedisSerializer
使用时注意事项:
当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
RedisTemplate使用时常见问题:
redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null。可以使用 StringRedisTemplate 试试。
4、实际测试
(1)完善配置文件application.yaml
spring:
redis:
host: 192.168.58.101
(2)GET和SET
package com.itzheng.demo.redisdemo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisDemoApplicationTests {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void contextLoads() {
redisTemplate.opsForValue().set("test","hello world");//操作字符串
String test = redisTemplate.opsForValue().get("test");
System.out.println(test);
}
}
在虚拟机查看数据
成功获取到数据
(3)Hash
package com.itzheng.demo.redisdemo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisDemoApplicationTests {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void contextLoads() {
redisTemplate.opsForValue().set("test","hello world");//操作字符串
String test = redisTemplate.opsForValue().get("test");
System.out.println(test);
BoundHashOperations<String, Object, Object> ops = redisTemplate.boundHashOps("user:123");
ops.put("name","Rose");
ops.put("age","21");
}
}
运行测试
运行成功
在虚拟机上测试
Java代码当中获取
package com.itzheng.demo.redisdemo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot以上是关于Java 之SpringData Redis快速入门 以及( Redis快速入门安装和使用)的主要内容,如果未能解决你的问题,请参考以下文章