在Spring Boot 2.0中使用Spring Data Redis编写自定义查询

简单的介绍

· Redis(远程字典服务器)是一个内存数据结构项目,实现了具有可选持久性的分布式内存键值数据库。Redis支持各种抽象数据结构,例如字符串、列表、映射、集合、排序集合、HyperLogLogs、流和空间索引。

· Spring Boot是Spring的基于约定的配置解决方案,用于创建可以“运行”的独立的、生产级的基于Spring的应用程序。它是由Spring团队针对最佳配置以及Spring平台和第三方库的最佳使用的“意见视图”预先配置的。大多数Spring Boot应用程序只需要很少的Spring配置。

· Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。提供了对Java中所有流行数据访问框架的支持:JDBC,iBatis / MyBatis,Hibernate,Java数据对象(JDO),Java持久性API(JPA),Oracle TopLink,Apache OJB和Apache Cayenne等。

下载并安装****Redis

·对于Linux,您可以从此处轻松下载最新版本(5.0)。

·如果您使用Windows 10,则可以受益于Docker映像,可从此处访问。

然后运行它:

$ docker run -d  --name redis -p  6379:6379 redis复制代码

6379是默认端口,您可以将其更改为所需的任何端口。

·如果使用Windows 7,则只能使用Redis 4.0版及以下版本,但不能使用最新版本(5.0)。可从此处下载Redis版本4.0.2的.msi和zip文件。

安装.msi版本后,您将看到redis-server和redis-cli,它们将分别运行Redis的服务器和客户端模块。

开启Spring Boot****项目

如果您使用maven来启动一个新的Spring Boot项目,只需要一个pom.xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>org.springframework</groupId>    <artifactId>gs-spring-boot</artifactId>    <version>0.1.0</version>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.1.6.RELEASE</version>    </parent>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>    </dependencies>    <properties>        <java.version>1.8</java.version>    </properties>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>复制代码

对于清晰的代码,我建议使用Lombok。有关更多信息,请参见this

<dependency>   <groupId>org.projectlombok</groupId>   <artifactId>lombok</artifactId>   <version>1.18.0</version>   <optional>true</optional></dependency>复制代码

准备Redis项目

将Spring Boot项目连接到Redis的一种简单方法是使用Spring Data Redis,因此我们需要将其添加到pom.xml中:

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-data-redis</artifactId></dependency>复制代码

我们有两种选择作为连接器:

1. Lettuce

2. Jedis

如果您选择Lettuce,则不需要向Maven添加任何其他依赖项,因为默认情况下,Spring Data使用该依赖项,并且该依赖项已嵌入到上述依赖项中。因此,我们选择更简单的方法。

为了启用Spring Data Redis存储库,我们需要有一个配置类,必须使用@Configuration和@EnableRedisRepositories进行注释。

在此类中,我们必须声明RedisTemplate bean,该CRUD存储库将其用于与Redis集成。我们还将使用它来执行自定义查询。

您可以轻松地使用LettuceConnectionFactory()创建factory,或者如果您想要进行其他配置(例如选择服务器地址和端口),则必须使用RedisStandaloneConfiguration(),如下所示:

@Beanpublic LettuceConnectionFactory redisConnectionFactory() {    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(hostName, port);    return new LettuceConnectionFactory(redisStandaloneConfiguration);}复制代码

创建restTemplate时,可以配置序列化和反序列化,为此我们使用JdkSerializationRedisSerializer:

@Beanpublic RedisTemplate<?, ?> redisTemplate() {    RedisTemplate<String, Object> template = new RedisTemplate<>();    RedisSerializer<String> stringSerializer = new StringRedisSerializer();    JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();    template.setConnectionFactory(redisConnectionFactory());    template.setKeySerializer(stringSerializer);    template.setHashKeySerializer(stringSerializer);    template.setValueSerializer(jdkSerializationRedisSerializer);    template.setHashValueSerializer(jdkSerializationRedisSerializer);    template.setEnableTransactionSupport(true);    template.afterPropertiesSet();    return template;}复制代码

实施****DAO

首先,我们需要创建一些实体类,这些实体类将映射到Redis数据结构。为此,我们需要使用

@RedisHash注释类。

另外,为了定义id字段,我们使用@Id。如果要索引除id以外的其他某些字段,则可以使用@Indexed对其进行注释,该索引也可以是list或map。

@Data@NoArgsConstructor@RedisHash("User")public class User implements Serializable{    @Id    private Long id;    private String name;    private String surname;    private String age;    public User(Long id, String name, String surname, String age) {        this.id = id;        this.name = name;        this.surname = surname;        this.age = age;    }}复制代码

实施仓库

Spring Data已经为我们实现了CRUD方法。我们只需创建扩展CrudRepository的接口即可轻松使用它们。

通过使用Spring Data的此功能,我们还可以声明比findById()或Save()更复杂的查询。

如果您想拥有更多的自定义查询,则可以使用redisTemplate自己完成,如下所示:

@Repositorypublic class UserDaoImpl implements UserDao {    @Autowired    UserRepository userRepository;    @Autowired    RedisTemplate redisTemplate;    private static final String KEY = "user";    public Boolean saveRule(User user) {        try {            Map ruleHash = new ObjectMapper().convertValue(user, Map.class);            redisTemplate.opsForHash().put(KEY, user.getName(), ruleHash);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    public User findByName(String name) {        Map userMap = (Map) redisTemplate.opsForHash().get(KEY, name);        User user = new ObjectMapper().convertValue(userMap, User.class);        return user;    }}复制代码

当然,我们的控制器是这样的:

@RestController@RequestMapping("/api")public class UserController {    @Autowired    AuthorizationService authorizationService;    @RequestMapping(value = "/addUser", method = RequestMethod.POST)    public ResponseEntity<String> addUser(@RequestBody User User) {        ModelMapper modelMapper = new ModelMapper();        User user = modelMapper.map(User, User.class);        Boolean result = authorizationService.saveRule(user);        if (result) {            return ResponseEntity.ok("A new user is saved!!!");        } else {            return ResponseEntity.ok("An error occured!!!");        }    }    @RequestMapping(value = "/findUser", method = RequestMethod.POST)    public ResponseEntity<User> findUser(@RequestBody User User) {        ModelMapper modelMapper = new ModelMapper();        User user = modelMapper.map(User, User.class);        User result = authorizationService.findByName(user.getName());        return ResponseEntity.ok(result);   }    复制代码

本人创业团队产品MadPecker,主要做BUG管理、测试管理、应用分发
网址:www.madpecker.com,有需要的朋友欢迎试用、体验!
本文为MadPecker团队译制,转载请标明出处

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容