Redis

Redis简介

  1. 概述

NoSQL:

SQL关系型数据库:MySQL  0racle

NoSQL非关系型数据库:Redis  Memcached...

No(Not Only)不仅仅关系型数据库,对关系型数据库的补充

学习NoSQL数据库时,不是为了取代关系型数据库

特点:

Key-Value存储系统

Value类型:(面试题

String(字符串)、

list(链表)、

set(集合)、

zset(sorted set----有序集合)

hash(哈希类型)

支持各种方式的排序(使用比较方便)

为了保证效率,数据都是缓存在内存中

C语言开发,提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Rudy、Erlang等客户端,使用很方便

  1. 应用场景

缓存(数据查询  短链接  新闻内容)

任务队列

排行榜

访问统计

  1. Redis安装配置

第一步:安装Redis编译的C环境

默认情况下CentOS系统中并没有安装C环境

安装命令:

yum install gcc-c++

安装过程中出现提示:

输入y确认即可

第二步:上传文件压缩包到Linux系统中

上传目录:/usr/local

借助远程工具直接上传即可

第三步:解压压缩包

安装目录:/usr/local

进入安装目录:

执行解压命令:

tar -xvf redis-5.0.4.tar.gz

第四步:编译

进入解压目录:

cd redis-5.0.4

执行make命令编译

make

第五步:安装

安装命令:

make PREFIX=/usr/local/redis install

cd src && make test

make[1]: Entering directory `/usr/local/redis-5.0.4/src'

You need tcl 8.5 or newer in order to run the Redis test

make[1]: *** [test] 错误 1

make[1]: Leaving directory `/usr/local/redis-5.0.4/src'

make: *** [test] 错误 2

原因:jemallloc 重载了Linux下的ANSI C中的malloc 和free函数

删除解压缩文件夹

重新执行编译命令(带参数)

make MALLOC=libc

安装命令:make PREFIX=/usr/local/redis install

第六步:测试运行

复制解压文件redis-5.0.4中的redis的配置文件redis.conf到安装目录redis中的bin目录

启动redis。进入redis中的bin目录下,执行命令

./redis-server redis.conf

出现下图,表示启动成功

上述方式启动,一旦关闭当前窗口,redis服务停止了

第七步:后台启动(建议使用)

修改配置文件:136行

进入bin目录,重新执行启动命令

./redis-server redis.conf

出现下图

  1. Redis其他配置
  1. 允许远程访问69行

  1. 密码设置507/508

注意:配置修改完成,建议重启

  1. 远程连接

远程连接命令

./redis-cli -a 123456 -p 6379

第一步:安装远程连接客户端

安装过程,下一步即可,可以自定义安装目录

第二步:输入内容测试连接

填写为自己的内容,测试连接(测试连接之前停用防火墙)

第三步:连接

测试成功直接连接即可

如果工具不可用,使用命令行连接即可

命令行失败:

密码设置没有生效

检查自己的配置文件

  1. Redis常用命令
  1. 启动Redis命令

Redis启动

进入Redis安装目录bin目录,执行命令:

./redis-server 

指定配置文件方式启动(后台启动

进入Redis安装目录bin目录,执行命令:

./redis-server redis.conf

  1. 客户端连接

指定密码和端口号

进入Redis安装目录bin目录,执行命令:

./redis-cli -a 123456 -p 6379
使用ping指令测试与主机的连接状态是否存在异常

  1. 其他命令

关闭、退出、重启

SHUTDOWN:关闭连接(杀死服务),慎重使用

Exit:退出命令(常用)

Quit:退出命令(常用)

//systemctl restart redis(当前系统中不一定生效),开发中可能需要使用

DBSIZE:数据库中key的数量

FLUSHDB:删除当前数据库中所有的key

FLUSHALL:删除所有库的信息

注意:Redis中默认有16个库

SELECT 数据库下标:切换数据库

注意:下标值从0开始,到15结束,如果当前数据库为0库时,不显示下标

Info:查看当前数据库的信息

  1. key关键字指令

常用指令:key

keys  *:查看当前数据库中所有的key

EXISTS  key名称:判断当前的key是否存在,存在返回1,不存在0

注意:key值不重复的,如果指定key的value值时,当前的key已经存在有值,覆盖

move  key的名称 数据库的下标:移动当前的key到指定下标的数据库中

EXPIRE  key的名称  时间():设置key的过期时间
ttl  key的名称:查看当前key的过期时间

注意:-2表示已经过期,-1表示永不过期

TYPE  key的名称:返回当前key的数据类型(String,Object)

  1. String类型数据指令

set  key的名称  value值:设置key-value一组值(单一键值对,key值重复,覆盖原value

get  key的名称 :获取指定key的value

del  key的名称(可以是多个):删除指定key的值

APPEND  key的名称  新值:给指定的key追加新值

STRLEN  key的名称:获取指定key的值的长度

截取:

GETRANGE  key的名称  起始下标  终点下标:截取范围内的字符串

GETRANGE  key的名称 0 -1:截取全部(比较常用)

替换:

SETRANGE  key的名称 起始下标  替换值:从指定位置开始替换相应的内容

设置key值:

SETEX  key的名称 存活时间 value值:设置一个值同时指定存活时间

SETNX  key的名称  value值:设置一个值同时永不过期(与set key的区别在于,当key值重复时,setnx返回0不修改set直接去修改原有值)

mset  key  vakue...:同时设置一组key-value...,永不过期

mget  key1 key2 keyn:一次性获取多个值,值不存在返回(nil),表示空值

MSETNX  key  value....:一次性设置多组key-value,key值存在返回0,执行失败

(key的value值必须为数字

INCR  key的名称:自增(value的值自动加1)

DECR  key的名称:自减(value的值自动减1)

INCRBY  key的名称  步长:自增(value的值自动加指定的步长)

DECRBY  key的名称  步长:自减(value的值自动减指定的步长)

  1. List类型指令(添加、删除 

LPUSH  key  values(多个值):创建集合设置一组值

注意:使用lpush指令向集合中添加元素时,添加顺序与显示顺序相反

RPUSH  key  values(多个值):创建集合设置一组值

注意:使用RPUSH 指令向集合中添加元素时,添加顺序与显示顺序相同

LRANGE  key  起始下标  结束下标:获取集合元素

LLEN  key:获取指定集合的长度

LPOP  key:移除集合中的第一个元素

RPOP  key:移除集合中的最后一个元素

LINDEX  key  下标:获取集合中指定下标的元素

LREM  key  count  value:删除指定个数(count)的值(value)在指定的的集合(key)中

注意:list集合中元素是可以重复的

  1. Set集合

SADD  key  元素:向集合中添加元素,set集合无序,元素不可重复

SMEMBERS  key:查看集合中元素

SCARD  key:返回集合长度

SREM  key  元素:删除集合中指定的元素

SPOP  key  元素个数:随机删除集合中指定个数的元素

SMOVE  key1  key2 元素:将某一个集合中的元素移动到另一个集合,如果说集合(目标key2)不存在,会创建集合接收移动过来的元素

SDIFF 差集

SINTER 交集

SUNION 并集

  1. Hash(哈希)(key---value(key value...))

HSET  key  filed  value :添加一组键值对 指定对象(key)的指定属性(filed)设置值(value)

HGET  key  field  :获取对象的属性值

HMSET  key  field1  value1...  :同时为一个对象指定多个属性值

HMGET  key  field...:同时获取对象的多个属性值

HGETALL  key:获取对象的全部属性及值

HDEL  key   field...:删除对象的属性(一个或多个)

HLEN  key:返回对象的属性个数

HEXISTS  key  field:判断当前key中是否有指定名称(field)的键值对

HKEYS  key:获取对象的全部属性

HVALS  key:获取对象全部属性的值

HINCRBY  key  field  值:为当前的数字属性增加值(可以是负数,表示减少)

HINCRBYFLOAT  key  field  值:为当前的数字属性增加值(小数)

HSETNX  key  field  value:添加值(同hset),重复元素不覆盖

  1. Zset

有序集合,是String类型的有序集合,也不可重复

Zset中有一个分数的概念,每一个元素都有自己的分数,zset根据分数对元素进行排序

英雄联盟:rank分

1000分   青铜

1200分   白银

1500分   黄金

1700分   铂金

1800分   钻石

2000分   王者

隐藏分高

腾讯会员:

500   vip1

1000  vip2

1500  vip3

......

ZADD  vips  500  v1  1000  v2  1500  v3  2000  v4:添加有序集合

ZRANGE  vips  0  -1:查询所有value

ZRANGE  vips  0  -1  withscores:查询结果带着分数

ZRANGEBYSCORE  vips  500  1500:根据分数查询

根据分数查询,显示分数

ZREM  vips  v4:删除元素v4

ZCARD  vips:统计元素个数

ZCOUNT  vips  500  2000:统计分数区间的元素的个数

ZRANK  vips  v2:统计元素的下标,如果元素不存在返回空值

ZSCORE  vips  v3:查看元素的分数

  1. Java操作Redis(重要

Redis不仅是使用命令来操作,基本上主流编程语言都有自己的客户端(操作Redis的API)

Java客户端:Jedis 、Redisson、 Jredis、 JDBC-Redis...

官网上推荐使用Jedis和Redisson

企业中使用的比较多的是Jedis

学习使用的就是Jedis

1、使用Jedis准备工作

连接失败:

远程连接配置:ip 0.0.0.0

防火墙关闭,放行6379   service iptables start

设置密码(必须设置

2、开发步骤(单实例连接

第一步:创建工程,添加依赖

依赖包:

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->

    <dependency>

        <groupId>redis.clients</groupId>

        <artifactId>jedis</artifactId>

        <version>2.9.0</version>

    </dependency>

第二步:创建连接,访问Redis(单实例连接)

以上方式为单实例连接(每次需要创建一个连接对象jedis)

    // 创建Jedis对象,指定远程访问的IP与端口号

        Jedis jedis = new Jedis("192.168.184.129",6379);

        // 认证:指定密码

        jedis.auth("123456");

        // 使用jedis对象操作Redis

        jedis.set("jedisDemo","Hello jedis!!!!");

        System.out.println(jedis.get("a"));

        // 关闭连接,释放资源

        jedis.close();

注意:Jedis对象操作Redis内容时,方法的名称基本与之前的常见命令保持一致

3、使用连接池连接Redis

public static void main(String[] args) {

        // 1.创建连接池对象

        JedisPool jedisPool = new JedisPool("192.168.184.129",6379);

        // 2.从池子中获取Jedis对象

        Jedis jedis = jedisPool.getResource();

        // 3.认证:密码

        jedis.auth("123456");

        // 4.数据操作

        System.out.println(jedis.get("a"));

        // 5.关闭连接

        jedis.close();

        // 6.关闭连接池

        jedisPool.close();

}

常见错误:

  1. Redis存储Java对象(序列化操作

定义序列化工具类

public class SerializeUtil {

    // 序列化

    // 将Java对象转换成字节数组

    // 将Java对象信息写入字节数组  OutputStream

    public static byte[] serialeze(Object object){

        // 对象输出流  将对象信息写入ByteArrayOutputStream

        ObjectOutputStream oos = null;

        // 存储对象信息

        ByteArrayOutputStream baos = null;

        byte[] bytes = null;

        try {

            baos = new ByteArrayOutputStream();

            oos = new ObjectOutputStream(baos);

            // 对象信息写入过程

            oos.writeObject(object);

            // 完成对象信息到字节数组的转换

            bytes = baos.toByteArray();

        } catch (IOException e) {

            e.printStackTrace();

        }

        return bytes;

    }

序列化过程:

    // 反序列化  字节数组中的数据读出来,存储到对象中

    public static Object deserialeze(byte[] bytes) throws IOException, ClassNotFoundException {

        ByteArrayInputStream bais = null;

        ObjectInputStream ois = null;

        try {

            bais = new ByteArrayInputStream(bytes);

            ois = new ObjectInputStream(bais);

        } catch (IOException e) {

            e.printStackTrace();

        }

        return ois.readObject();

    }

使用工具类方法存取对象

存:jedis.set("p3".getBytes(),SerializeUtil.serialeze(person));

取:Person person = (Person) SerializeUtil.deserialeze(jedis.get("p3".getBytes()));

  1. Redis存储Java对象(Json格式存储)

Google:Gson

阿里巴巴:FastJson

存:将Java对象转换成Json数据,存储到Redis中

取:将Json数据取出,转换成Java对象

使用步骤

第一步导入第三方Jar包(Gson\FastJson)

<!-- gson -->

<dependency>

    <groupId>com.google.code.gson</groupId>

    <artifactId>gson</artifactId>

    <version>2.8.5</version>

</dependency>

<!-- fastjson -->

<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>fastjson</artifactId>

    <version>1.2.68</version>

</dependency>

第二步:存取数据(Java对象与Json串相互转换)

使用Gson

//使用Gson将对象转换成Json串

    Gson gson = new Gson();

    String perJson = gson.toJson(person);

//使用Gson对象将json串转成Java对象

Person person1 = gson.fromJson(json,Person.class);

使用FastJson

//使用FastJson将Java对象转换成Json串

String Json = JSON.toJSONString(person);

//使用FastJson将Json串转成Java对象

Person person = JSON.parseObject(Json,Person.class);

补充知识点(了解):GsonFomat插件使用

功能:给定Json串可以自动生成Java实体类

  1. 安装插件

  1. 重启Idea

  1. 使用

创建实体类

在类中使用快捷键:ALT+insert

复制json串到窗口中

点击ok自动生成实体类中的内容

  1. Spring整合Jedis
  1. Spring整合Jedis原理

Spring整合过JDBC

Spring整合过MyBatis

Spring整合Jedis

“Spring整合什么什么内容”,意思就是将什么什么对象交给Spring容器管理

Jedis对象操作Redis的核心对象

Jedis对象可以从连接池中获取

向Spring容器中添加一个连接池对象:JedisPool

创建Jedis   容器.getBean(pool).getResources()

  1. 整合步骤

第一步:创建项目,导入相关依赖

<properties>

        <spring.version>5.1.3.RELEASE</spring.version>

    </properties>

    <dependencies>

        <!-- Spring -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-core</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-context</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-context-support</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-beans</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-tx</artifactId>

            <version>${spring.version}</version>

        </dependency>

        <dependency>

            <groupId>commons-logging</groupId>

            <artifactId>commons-logging</artifactId>

            <version>1.1.3</version>

        </dependency>

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-simple</artifactId>

            <version>1.7.5</version>

        </dependency>

        <dependency>

            <groupId>Redis.clients</groupId>

            <artifactId>jedis</artifactId>

            <version>2.9.0</version>

        </dependency>

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.12</version>

            <scope>test</scope>

        </dependency>

</dependencies>

第二步:创建Spring核心配置文件,容器中配置连接池

<!--连接池配置对象-->

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">

        <!-- 最大连接数 -->

        <property name="maxTotal" value="10"/>

        <!-- 空闲连接数 -->

        <property name="maxIdle" value="2"/>

        <!-- 设置链接池的连接耗尽时,是否等待 -->

        <property name="blockWhenExhausted" value="true"/>

        <!-- 最大等待时间 -->

        <property name="maxWaitMillis" value="30000"/>

        <!-- 获取到连接时,是否检查链接的有效性 -->

        <property name="testOnBorrow" value="true"/>

    </bean>

    

    <!--注入连接池对象:构造函数方式注入 -->

    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">

        <!-- 池的属性 -->

        <constructor-arg name="poolConfig" ref="poolConfig"/>

        <!-- Redis主机地址 -->

        <constructor-arg name="host" value="192.168.184.129"/>

        <!-- Redis主机端口 -->

        <constructor-arg name="port" value="6379"/>

        <!-- Redis密码 -->

        <constructor-arg name="password" value="123456"/>

        <!-- 可以选择Redis数据库(要选择数据库,必须开启了密码) -->

        <constructor-arg name="database" value="0"/>

        <!-- 链接超时时间 -->

        <constructor-arg name="timeout" value="30000"/>

    </bean>

注意:

Redis安装完成允许远程连接,必须设置密码

Spring整合JedisPool(连接池)时,使用的构造函数注入,编写时务必注意属性名称

个数

第三步:编写测试类

public static void main(String[] args) {

        //创建容器

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-jedis.xml");

        //获取连接池对象

        JedisPool jedisPool = (JedisPool) applicationContext.getBean("jedisPool");

        //创建Jedis对象

        Jedis jedis = jedisPool.getResource();

        //数据操作

        System.out.println(jedis.get("a"));

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值