Redis简介-安装-Spring-SpringBoot集成教程

一、 什么是NoSQL

NoSql是为了解决高并发、高可扩展、高可用以及高写入而产生的数据库解决方案。

NoSql就是Not Only sql。Nosql是非关系型数据库,它是关系型数据库的良好补充,而不能替代关系型数据库。

二、 Nosql数据库分类

  1. 键值(Key-Value)存储数据库

    • 相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
    • 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
    • 数据模型: 一系列键值对
    • 优势: 快速查询
    • 劣势: 存储的数据缺少结构化
  2. 列存储数据库

    • 相关产品:Cassandra, HBase, Riak
    • 典型应用:分布式的文件系统
    • 数据模型:以列簇式存储,将同一列数据存在一起
    • 优势:查找速度快,可扩展性强,更容易进行分布式扩展
    • 劣势:功能相对局限
  3. 文档型数据库

    • 相关产品:CouchDB、MongoDB
    • 典型应用:Web应用(与Key-Value类似,Value是结构化的)
    • 数据模型: 一系列键值对
    • 优势:数据结构要求不严格
    • 劣势: 查询性能不高,而且缺乏统一的查询语法
  4. 图形(Graph)数据库

    • 相关数据库:Neo4J、InfoGrid、Infinite Graph
    • 典型应用:社交网络
    • 数据模型:图结构
    • 优势:利用图结构相关算法。
    • 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

三、 什么是redis

Redis是用C语言开发的高性能的键值对存储的非关系数据库。Redis存储的数据类型有以下几种:字符(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(ZSet)

四、历史发展

  2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
  SalvatoreSanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。HackerNews在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。

  VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

五、redis的应用场景

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
  • 分布式集群架构中的session分离。
  • 聊天室的在线好友列表。
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜。
  • 网站访问统计。
  • 数据过期处理(可以精确到毫秒)

六、redis安装与启动

 ——-安装

  1. 进入Linux控制终端,下载Redis安装包
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
  1. 安装C语言环境(已经安装->跳过)
yum install gcc-c++
  1. 解压Redis安装包
tar -zxf redis-3.0.6.tar.gz
  1. 进入解压目录并编译Redis
cd redis-3.0.6
make
  1. 安装Redis
make install PREFIX=/usr/local/redis

如果出现以下类似信息则说明安装正常

make[1]: Entering directory `/root/redis-3.0.6/src'

Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: Leaving directory `/root/redis-3.0.6/src

 ——启动

进入到安装目录的bin目录

cd /usr/local/redis/bin
  • 前台启动

比较少用,一旦启动redis的客户端关闭,则redis也关闭。

./redis-server
  • 后台启动

    • 将redis.conf拷贝到bin目录下(redis.conf位于redis解压目录下)
    cp -r /root/redis-3.0.6/redis.conf /usr/local/redis/bin/
    • 修改redis.conf配置
    vim redis.conf

    将daemonize 改为yes (第42行)


    • 启动redis
    ./redis-server redis.conf

七、客户端连接

redis本机自带客户端连接

 ./redis-cli -h 127.0.0.1 -p 6379

-h:指定主机IP

-p:指定主机端口


./redis-cli

默认主机IP是127.0.0.1 默认端口 6379

使用图形软件连接

  1. 下载软件

下载GitHub网址

https://github.com/uglide/RedisDesktopManager/releases/

mac下载地址

https://github.com/uglide/RedisDesktopManager/releases/download/0.9.0-alpha4/redis-desktop-manager-0.9.0.51.dmg

ps:在我的mac上不能用,可能因为用了最新的系统,找了另外一个软件:https://github.com/caoxinyu/RedisClient/tree/OSX,下载下来用以下命令启动。

nohup java -XstartOnFirstThread -jar redisclient-OSX.jar >/dev/null 2>&1 &

可以将这段保存为脚本start.sh执行,(先更改权限chmod 777 start.sh),然后命令行的当前目录执行./satrt.sh

windows下载网址

https://github.com/uglide/RedisDesktopManager/releases/download/0.9.0-alpha4/redis-desktop-manager-0.9.0.559.exe
  1. 安装就不用多说了,双击即可

  2. 现在没有设置密码,直接add server,填写ip和端口即可。

八、Spring集成

jar文件

##maven
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

##gradle
compile group: 'redis.clients', name: 'jedis', version: '2.9.0'

配置文件

    <!-- 连接池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大连接数 -->
        <property name="maxTotal" value="30" />
        <!-- 最大空闲连接数 -->
        <property name="maxIdle" value="10" />
        <!-- 每次释放连接的最大数目 -->
        <property name="numTestsPerEvictionRun" value="1024" />
        <!-- 释放连接的扫描间隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!-- 连接最小空闲时间 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
        <property name="softMinEvictableIdleTimeMillis" value="10000" />
        <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
        <property name="maxWaitMillis" value="1500" />
        <!-- 在获取连接的时候检查有效性, 默认false -->
        <property name="testOnBorrow" value="false" />
        <!-- 在空闲时检查有效性, 默认false -->
        <property name="testWhileIdle" value="true" />
        <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
        <property name="blockWhenExhausted" value="false" />
    </bean>

    <!-- redis单机 通过连接池 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool"
        destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
        <constructor-arg name="host" value="127.0.0.1" />
        <constructor-arg name="port" value="6379" />
    </bean>

测试代码

    @Test
    public void testJedisPool() {
        JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
        Jedis jedis = null;
        try {
            jedis = pool.getResource();

            jedis.set("name", "lisi");
            String name = jedis.get("name");
            System.out.println(name);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (jedis != null) {
                // 关闭连接
                jedis.close();
            }
        }
    }

九、设置redis密码

编辑/usr/local/redis/bin/redis.conf的396行。(小提示:命令行模式下396gg就跳转到396行了),将注释打开,更改为自己的密码。命令行模式下,输入:wq保存退出。

requirepass 123456

重启
首先查询到redis的pid后,kill掉,然后重启

[root@localhost bin]# ps -ef|grep redis
root      20940      1  0 12:12 ?        00:00:18 ./redis-server *:6379 
[root@localhost bin]# kill 20940
[root@localhost bin]# ./redis-server redis.conf 

十、SpringBoot集成

  springboot中只需要加入依赖,就会帮我们自动配置好redisTemplate,stringredisTemplate,使用十分方便。除了string,list,set,zset,hash,还支持存入对象。(对象必需实现Serializable)

  1. 加入起步Starter

gradle

//redis
compile('org.springframework.boot:spring-boot-starter-data-redis')

maven的方式百度下就有,看到这里的人应该有能力查到了。

  1. 对redis进行一些配置(没配置密码)

application.properties

#--------------------------redis----------------------------
# 使用的数据库,共16个0-15
spring.redis.database=0
#连接地址
spring.redis.host=172.16.160.129
#密码
spring.redis.password=123456
#连接端口
spring.redis.port=6379
#最大连接数
spring.redis.pool.max-active=8
#是否为安全连接(https,ssl)
spring.redis.ssl=false
#超时
spring.redis.timeout=1000
  1. 使用示例

UserTest对象

import lombok.Data;
import java.io.Serializable;

@Data//使用了lombok
public class UserTest implements Serializable {

    private String name;

    private String address;

    private Integer age;

}
import com.kingboy.CommonApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.Set;

/**
 * @Author kingboy
 * @Date 2017/7/19 下午5:09
 * @Description RedisTest is used to redisTest
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = CommonApplication.class)
public class RedisTest {

    @Resource
    StringRedisTemplate stringRedisTemplate;

    @Resource
    RedisTemplate redisTemplate;

    /**
     * 测试StringRedisTemplate
     */
    @Test
    public void StringRedisTemplateTest() {
        //String
        stringRedisTemplate.opsForValue().set("king","hello world!");
        String king = stringRedisTemplate.opsForValue().get("king");
        System.out.println("String获取的值:" + king);
        //set
        stringRedisTemplate.opsForSet().add("kingset", "1", "2", "3");
        Set<String> kingset = stringRedisTemplate.opsForSet().members("kingset");
        System.out.println("Set获取的值:" + kingset);
        //zset,hash,list省略
    }

    /**
     * 测试redisTemplate
     */
    @Test
    public void redisTemplateTest() {
        redisTemplate.opsForList().leftPush("listtest", "param1");
        Object index = redisTemplate.opsForList().index("listtest", 0);
        System.out.println("list" + index);
        //zset,hash,string,set省略
    }

    /**
     * 测试存入对象
     * 存入的对象需要实现Serializable接口
     */
    @Test
    public void saveObjectTest() {
        //创建
        UserTest userTest = new UserTest();
        userTest.setName("小金2");
        userTest.setAge(12);
        userTest.setAddress("BeiJing");
        //存
        redisTemplate.opsForHash().put("user", userTest.hashCode(), userTest);
        //取
        UserTest user = (UserTest) redisTemplate.opsForHash().get("user", userTest.hashCode());
        System.out.println(user);

    }

}

十一、项目

自己在github新建了springboot的项目,供个人研究,项目地址:

https://github.com/KingBoyWorld/aurora.git,

项目中演示了actuator的使用(actuator_feature分支),redis的集成(redis_feature分支)等功能,感兴趣可以下载看看,如有错误,欢迎指正。

十二、关于Redis使用

主要是String,Set,ZSet,List,Hash的使用,以及过期时间、本地序列存储等,网止很多教程,以后有空自己再整理一份。

记录完了,有句话不知当讲不当讲………………

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页