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 字符串命令:

序号命令及描述
1SET key value
设置指定 key 的值
2GET key
获取指定 key 的值。
3GETRANGE key start end
返回 key 中字符串值的子字符
4GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6MGET key1 [key2..]
获取所有(一个或多个)给定 key 的值。
7SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9SETNX key value
只有在 key 不存在时设置 key 的值。
10SETRANGE key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11STRLEN key
返回 key 所储存的字符串值的长度。
12MSET key value [key value ...]
同时设置一个或多个 key-value 对。
13MSETNX key value [key value ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15INCR key
将 key 中储存的数字值增一。
16INCRBY key increment
将 key 所储存的值加上给定的增量值(increment) 。
17INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment) 。
18DECR key
将 key 中储存的数字值减一。
19DECRBY key decrement
key 所储存的值减去给定的减量值(decrement) 。
20APPEND 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 基本的相关命令:

序号命令及描述
1HDEL key field1 [field2]
删除一个或多个哈希表字段
2HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
3HGET key field
获取存储在哈希表中指定字段的值。
4HGETALL key
获取在哈希表中指定 key 的所有字段和值
5HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。
6HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7HKEYS key
获取所有哈希表中的字段
8HLEN key
获取哈希表中字段的数量
9HMGET key field1 [field2]
获取所有给定字段的值
10HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
11HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
12HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值。
13HVALS key
获取哈希表中所有值。
14HSCAN 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快速入门安装和使用)的主要内容,如果未能解决你的问题,请参考以下文章

SpringData Redis 常见操作

SpringData-Redis发布订阅自动重连分析

SpringBoot缓存技术整合SpringData Redis

Spring Data Redis 管理Redis 之1

Springdata-redis在项目中的使用

SpringData 基于SpringBoot快速入门