redis介绍

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1]

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。

redis安装

1、下载redis

在这里插入图片描述

2、上传到linux上并进行解压缩(usr/local目录下)

tar zxf redis-5.0.5.tar.gz 

3、按装redis运行环境

Redis是c语言开发的安装redis需要c语言的编译环境。如果没有gcc需要在线安装。

yum install gcc-c++
yum -y install gcc automake autoconf libtool make 
yum -y install  tcl

4、编译。进入redis目录。

make 

5、安装 PREFIX参数指定redis的安装目录。一般软件安装到/usr/local/redis目录下

make install PREFIX=/usr/local/redis

redis服务启动

  • 在redis/bin目录下 ./redis-server 【会阻断前端窗口】
  • 在另一个连接的redis/bin目录下 执行./redis-cli
    • 127.0.0.1:6379> quit/exit 退出

redis服务关闭

  • 在redis/bin目录下 执行./redis-cli shutdown

  • 直接暴力关闭 ctrl+C

使redis服务后台启动

  • 先把redis-5.0.5【redis解压缩的包】中的redis.conf 复制到 redis/bin目录中
cp redis.conf /usr/local/redis/bin
  • 编辑redis.conf 把daemonize 改为yes【守护线程打开】
daemonize yes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZBx7S1Dc-1657028613509)(E:\Java资料\笔记整理\JavaUp\笔记整理\redis.assets\image-20220611004703419.png)]

  • 按照配置的方式启动【不会阻塞前端窗口】
./redis-server redis.conf 

 ps aux | grep redis进程  // 查看 redis进程

设置远程连接redis

  • 编辑redis.conf 把bind给注释掉【默认绑定到本机】
#bind 127.0.0.1

在这里插入图片描述

  • 在redis.conf 中默认受保护模式关闭【为了远程可以操作数据】【不推荐使用。因为受保护模式关闭后任何人都可以修改数据】
protected-mode no

在这里插入图片描述

  • 远程连接
./redis-server redis.conf //开启redis服务
./redis-cli -h 192.168.146.132 -p 6379 // 远程连接

在这里插入图片描述

  • 通过密码来修改数据【推荐使用】。编辑redis.conf 。打开后保护模式,
 requirepass 123456  // 设置密码

在这里插入图片描述

  • 远程连接【auth 认证密码】
./redis-server redis.conf //开启redis服务
./redis-cli -h 192.168.146.132 -p 6379 // 远程连接
192.168.146.132:6379> auth 123456   // 认证密码
OK
 ./redis-cli -a 123456 shutdown   // 通过密码的方式关闭redis服务    

在这里插入图片描述

Redis的数据类型

String类型

【Map<String,String>】

语法 set key  value    //设置key的值 
示例:set name zhangsan
     set age 22
	 set name lisi  //如果key存在,将会覆盖原来key的值
语法  get key     //获取key的值
  示例:get name
        get age
语法  del key      //删除指定key的值
  示例:del name
        del age
语法: append key value  //在原来的值的基础上添加新值 
示例:set name zhangsan 
     append name lisi 
语法: strlen  key       //获取指定key的值的长度
        strlen  name      12
语法: getrange key  start end  
    // 获取指定key的值,从start位置开始,end位置结束
示列:getrange name 2 7
语法: setrange key offset value 
    //从起始位置替换值 【按照替换内容位数依次替换】
示例:setrange name 2 abc
语法: setex key second  value  //设置key的值并指定存活时间 【秒】
  示例: setex name 100 lisi 
  示例:ttl name 
      //【显示存活时间 返回值为-2表示失效 返回值为-1表示永久有效】
语法: expire key second//先设置键值对,在设置过期时间
   示例:set gender man
   示例:expire gender 2020秒后过期 】
语法:setnx key value           // 设置key的值并且永久有效
示例:setnx address beijing
语法: incr key     //对key的值自增1
示列: incr currentPage 
语法: decr key     //对key的值自减1
示列: decr currentPage 
语法: incrby key  number     //对key的值递增number
示列: incrby currentPage 10
语法: decrby key  number    // 对key的值递减number
示列: decrby currentPage 5
语法: mset key1 value1 key2 value2 ....  
    //一次性设置多个key-value键值对
示列: mset name1 zhangsan name2 lisi name3 wangwu
语法: mget key1 key2 ....   // 一次性获取多个key的值
示列: mget name1 name2
语法  persist key           // 设该key永久有效 
示列  persist address
语法  ttl key      //查看key的存活时间  如果返回-1 表示永久有效
示例  ttl name

Hash数据类型

【Map<String,Map<String,String>>】

语法: hset key  field  value   //设置key 的 field字段的值
示列: hset person name lisi
     hset person address changsha
     hset person birthday 1997-10-10
语法: hget key field           //获取key的field字段的值
示例: hget person name
//一次设置key的多个字段的值
语法: hmset key field1 value1  field2 value2 ....   
示例: hmset student name wagnwu age 22 gender man
 //一次获取key的多个字段的值
语法: hmget key  field1 field2 ....              
示例: hmget student name age gender
语法: hgetall key         //获取key的多个字段的值(包括键和值)
示例: hgetall student
语法: hkeys key           //获取key的所有字段
示例: hkeys student
语法: hvals key           // 获取key的所有字段的值
示例: hvals student
//删除key的所有多个字段的值
语法: hdel key field1 field2 ...     
示例: hvals student
语法: hlen key          // 返回key的所有键值对的个数
示例: hlen student
//返回key的field字段是否存在【0表示不存在,1表示存在】
语法: hexists key field       
示例: hexists student name

List数据类型

语法: lpush key value1 value2....  // 向key集合的左边一次添加值
示例: lpush ages 22 34 21 45 20
语法: rpush key value1 value2.... // 向key集合的右边一次添加值
示例: rpush names zhangsan lisi wangwu zhaooiu
语法: lrange key start stop  
//取key集合中指定的start位置到stop位置的内容(-1代表集合结束)
示列:lrange ages 0 2
     lrange ages 0 -1
     lrange ages 0 100
语法: llen   key             //查看key集合的长度
示例: llen ages
语法: lpop   key             //删除key集合的第一个元素
示例: lpop  ages
语法: rpop   key             //删除key集合的最后一个元素
示例: rpop   ages
语法: lindex  key  index     //获取key集合的index索引的元素
示例: lindex   ages  2
//删除key集合的count个索引的元素(集合中有重复值) 
语法: lrem key count value                     
示例: lrem ages 2  45

Set数据类型

// 向为key的集合中添加多个值(去重) 
语法: sadd  key  value1 value2 ...                  
示例:
192.168.146.132:6379> sadd ages 20 20 21 22 23 24 
(integer) 5
// 循环key集合中的所有值       
语法: smembers   key               
示例:
192.168.146.132:6379> smembers ages
1) "20"
2) "21"
3) "22"
4) "23"
5) "24"
// 统计key集合中的元素个数        
语法: scard   key                   
示例:
192.168.146.132:6379> scard ages
(integer) 5
// 删除key集合中的value值      
语法:  srem    key   value                     
示例:
192.168.146.132:6379> srem ages 20
(integer) 1
//  随机删除key集合中的某个值     
语法: spop    key                 
示例:
192.168.146.132:6379> srem ages 20
(integer) 1
// 将集合中的某个值赋给另外一个集合: SMOVE 源集合  目的集合  值     
语法: smove source destination member            
示例:
192.168.146.132:6379> smove names student zhangsan
(integer) 1
  • 求差集 差集 并集
// 创建两个set集合
192.168.146.132:6379> sadd a1 a b c d e f
(integer) 6
192.168.146.132:6379> sadd a2 c d e f g h
(integer) 6
// 求差集 
语法: Sdiff   集合1  集合2                  
示例:
192.168.146.132:6379> sdiff a1 a2  
1) "a"
2) "b"
192.168.146.132:6379> sdiff a2 a1
1) "g"
2) "h"
// 求交集
语法:  sinter  集合1  集合2                
示例:
192.168.146.132:6379> sinter a1 a2
1) "c"
2) "d"
3) "e"
4) "f"
// 求并集 
语法: sunion  集合1  集合2               
示例:
192.168.146.132:6379> sinter a1 a2
192.168.146.132:6379> sunion a1 a2
1) "a"
2) "c"
3) "d"
4) "e"
5) "f"
6) "g"
7) "h"
8) "b"

zset(SortedSet)数据类型

 //  向为key的集合中添加多个(score-value) 
语法: zadd  key   score value ...               
示例: 
192.168.146.132:6379> zadd students 90 zhangsan 50 lisi 60 wangwu 40 zhaoliu 80 zhouqi
(integer) 5
 //  循环key的集合从start位到stop位置的值
语法:zrange key start stop [WITHSCORES]  
    zrange key start stop withscores
示例: 
192.168.146.132:6379> zrange students 0 -1
1) "zhaoliu"
2) "lisi"
3) "wangwu"
4) "zhouqi"
5) "zhangsan"
    
192.168.146.132:6379> zrange students 0 -1 withscores
 1) "zhaoliu"
 2) "40"
 3) "lisi"
 4) "50"
 5) "wangwu"
 6) "60"
 7) "zhouqi"
 8) "80"
 9) "zhangsan"
10) "90"
 //   删除key集合中指定的value元素  
语法:  zrem key value          
示例: 
192.168.146.132:6379> zrem students lisi
(integer) 1
 //  逆序显示key集合中的元素  
语法:zrevrange key start stop   [WITHSCORES]  
    zrevrange key start stop  withscores
示例: 
192.168.146.132:6379> zrevrange students 0 -1 withscores
1) "zhangsan"
2) "90"
3) "zhouqi"
4) "80"
5) "wangwu"
6) "60"
7) "zhaoliu"
8) "40"
 //    根据分数区间查询内容
语法: zrangebyscore key min max               
示例: 
192.168.146.132:6379> zrangebyscore students 50 65
1) "wangwu"
 //     统计key集合中有多少个键值对
语法: zcard key            
示例: 
192.168.146.132:6379> zcard students
(integer) 4
 //   统计key集合中min到max区间元素
语法: zcount key min max               
示例: 
192.168.146.132:6379> zcount students 40 65
(integer) 2
 // 统计key集合中指定元素索引
语法: zrank students wangwu                
示例: 
192.168.146.132:6379> zrank students zhangsan
(integer) 3
 //  统计key集合中指定元素的分数
语法: zscore key value        
示例: 
192.168.146.132:6379> zscore students zhangsan
"90"

redis的持久化方案

第一种持久化方案(默认rdb)

Redis中所有的key和value默认加载到内存中,为了数据的不丢失,把数据进行持久化,通常会把数据落地磁盘。

特点:对于数据不敏感,可以用这种方式,可以会丢数据,但效率高。(减少I/o操作)。

默认方案

在这里插入图片描述

第二种持久化方案 aof

修改redis.conf配置中 appendonly 改为yes

在这里插入图片描述

特点:对数据特别敏感,保证不能丢数据。效率低(增加I/o操作)

在idea中利用Jedis API来操作redis

在pom文件中导入依赖


    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.20.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.20.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.20.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.20.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>4.3.20.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.20.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!-- 返回json字符串的支持  -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

在resources中创建applicationContext.xml,配置。把相关的类交给spring容器管理

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">


    <!--jedis池参数配置-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大空闲连接数 -->
        <property name="maxIdle" value="3" />
        <!-- 最大连接数 -->
        <property name="maxTotal" value="5" />
        <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
        <property name="blockWhenExhausted" value="true" />
        <!-- 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1 -->
        <property name="maxWaitMillis" value="30000" />
        <!-- 在获取连接的时候检查有效性 -->
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
        <constructor-arg name="host" value="192.168.146.132" />
        <constructor-arg name="port" value="6379" />
        <constructor-arg name="timeout" value="30000" />
        <constructor-arg name="password" value="123456"></constructor-arg>
    </bean>


</beans>

创建测试类测试:

package com;

import com.chenshuang.entity.Person;
import com.chenshuang.utils.JsonUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.annotation.Resource;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class test {
    @Resource
    private JedisPool jedisPool;

    // 把Sting数据到redis中
    @Test
    public void testString(){
        Jedis jedis = jedisPool.getResource();
        jedis.set("sushe","301");
        jedis.close(); // 关闭连接
    }

    @Test
    // 把HashMap类型的数据存入redis中
    public void testHashMap(){
        Jedis jedis = jedisPool.getResource();
        jedis.hset("animals","tiger","大王");
        jedis.hset("animals","dog","阿福");
        jedis.hset("animals","cat","咪咪");
        jedis.close(); // 关闭连接
    }

    @Test
    // 把对象转成json格式后,存到redis中
    public void objectToEntity(){
        Jedis jedis = jedisPool.getResource();
        Person person = new Person(1, "张三", "男", 23);
        String s = JsonUtils.objectToJson(person);
        jedis.set("1",s);
        jedis.close(); // 关闭连接
    }

    @Test
    // 把redis中的json格式取到程序中输出
    public void entityToObject(){
        Jedis jedis = jedisPool.getResource();
        String s = jedis.get("1");
        Person person = JsonUtils.jsonToEntity(s, Person.class);
        System.out.println(person);
        jedis.close(); // 关闭连接
    }

}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐