redis 详细介绍、下载安装和使用

1、redis介绍

redis是一款特殊的数据库软件,它是一款高性能的NOSQL系列的非关系型数据库。

1.1 什么是NOSQL?

NOSQL(Not Only SQL)即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。

1.2 关系型数据库和非关系型数据库的区别:

1.2.1 关系型数据库:

①数据之间有关联关系

②数据存储在硬盘的文件上

③当对表中的数据进行一些增删改查操作时,要对硬盘上的文件进行一些IO操作,但IO操作对内存的性能是很低的,因此就需要花费大量的时间,效率就比较低 

④复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询

⑤事务支持使得对于安全性很高的数据访问要求得以实现 

1.2.2 非关系型数据库:

①数据之间没有关联关系

②数据存储在内存中

③当对数据进行一些增删改查操作时,只需要在内存中直接操作即可,因此花费时间较少,效率就比较高

在内存中开辟一块空间,用于存放数据,这块内存空间叫做缓存,因此可以使用redis做缓存。

④性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高

⑤可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展

总结:一般将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据

1.3 nosql型数据库的优点:

①成本:nosql数据库简单易部署,基本都是开源软件,价格便宜

②查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库

③存储数据的格式:nosql的存储格式是key, value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而关系型数据库只支持基础类型

④扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难

1.4 nosql型数据库的缺点:

①维护的工具和资料有限,因为nosql是属于新的技术,不能喝关系型数据库相提并论

②不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本

③不提供关系型数据库对事务的处理

1.5 redis的应用场景:

①缓存(数据查询、短连接、新闻内容、商品内容等等)

②聊天室的在线好友列表

③任务队列(秒杀、抢购、12306等等)

④应用排行榜

⑤网站访问统计

⑥数据过期处理(可以精确到毫秒)

⑦分布式集群架构中的session分离

2、下载、安装、简单使用

2.1 下载

redis官网下载地址:https://redis.io/download(注意:官网下载的是Linux版本的)


redis Windows版本64位下载地址:https://github.com/microsoftarchive/redis/releases(注意:有时候无法访问GitHub)


我使用的Windows版本64位:免费下载https://download.csdn.net/download/YyjYsj/12921032

2.2 解压 Redis3_win.zip,解压后的文件结构:

 2.3 启动

2.3.1 启动服务器端

2.3.2 启动客户端

 注意:启动客户端之前不能将服务器端的cmd窗口关闭,否则Redis服务不可用,无法使用客户端

2.4 简单使用

3、 命令操作

3.1 redis的数据结构

redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构

value的数据结构:

①字符串类型:string

②哈希类型:hash :相当于map格式

③列表类型:list :相当于linkedlist格式

④集合类型:set :相当于HashSet格式

⑤有序集合类型:sortedset

3.2 使用命令来操作这5种不同的数据类型 

可以自行查看Redis教程中的所有命令:https://www.redis.net.cn/tutorial/3501.html

下面简单介绍一些操作命令:

3.2.1 字符串类型:string

①存储:set key value

②获取:get key 

③删除:del key

例如:

3.2.2 哈希类型:hash

①存储:hset key field value

②获取: 

1️⃣获取指定的field对应的值:hget key field

2️⃣获取所有的field和value:hgetall key

③删除:hdel key field

例如:

3.2.3 列表类型:list :可以添加一个元素到列表的头部(左边)或者尾部(右边)

①存储:

1️⃣将元素加入到列表左边:lpush key value

2️⃣将元素加入到列表右边:rpush key value

②获取: 

获取一个范围内的值:lrange key start end

③删除:

1️⃣删除列表最左边的元素,并返回:lpop key

2️⃣删除列表最右边的元素,并返回:rpop key

例如:

3.2.4 集合类型:set

①存储:sadd key value

②获取: 

获取set集合中的所有元素:smembers key

③删除:

删除set集合中的某个元素:srem key value

例如:

3.2.5 有序集合类型:sortedset

①存储:zadd key score value

②获取:zrange key start end

③删除:zren key value

例如:

3.3 通用命令 

①查询所有的键:keys *

②获取键对应的value的类型:type key

③删除指定的key value:del key

4、持久化

4.1 概念:

redis是一个内存数据库,当redis服务器重启,或者电脑重启时,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中

4.2 redis持久化机制

4.2.1 RDB:(推荐使用)

在一定的时间间隔中,检测key的变化情况,然后持久化数据。默认方式,不需要进行配置,默认就使用这种机制

Ⅰ 编辑 redis.windows.conf 文件,可以自己修改下面的一些配置数据

#   after 900 sec (15 min) if at least 1 key changed

save 900 1
#   after 300 sec (5 min) if at least 10 keys changed

save 300 10
#   after 60 sec if at least 10000 keys changed

save 60 10000

Ⅱ 重新启动redis服务器,并指定配置文件名称

修改完之后,重启redis服务器,重启方法:

1️⃣在redis的安装目录的地址栏中输入 cmd 回车,即可在当前文件夹中打开命令行窗口

2️⃣输入 :redis-server.exe redis.windows.conf

4.2.2 AOF:(不推荐使用)

日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据

Ⅰ 编辑 redis.windows.conf 文件,可以自己修改下面的一些配置数据

appendonly no(关闭AOF) -->  appendonly yes(开启AOF)

# appendfsync always :每一次操作都进行持久化
appendfsync everysec :每隔一秒进行一次持久化
# appendfsync no :不进行持久化 

Ⅱ 重新启动redis服务器,并指定配置文件名称

修改完之后,重启redis服务器,重启方法:

1️⃣在redis的安装目录的地址栏中输入 cmd 回车,即可在当前文件夹中打开命令行窗口

2️⃣输入 :redis-server.exe redis.windows.conf

5、Java客户端 Jedis

5.1 Jedis概念

是一款java操作redis数据库的工具

5.2 下载jedis的jar包,并导入到项目中的lib目录下

下载链接:https://mvnrepository.com/artifact/redis.clients/jedis

点击:jar 即可下载

 5.3 简单使用演示

5.3.1 写一个测试类

package jedis.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;

//jedis的测试类
public class JedisTest {
    @Test
    public void test1(){
        //1.获取连接
        Jedis jedis = new Jedis();//如果使用空参构造,默认值为 localhost , 6379端口
//        Jedis jedis = new Jedis("localhost");
//        Jedis jedis = new Jedis("localhost",6379);
        //2.操作
        jedis.set("username","zhangsan");
        //3.关闭连接
        jedis.close();
    }
}

5.3.2 启动redis服务器和客户端

5.3.3 在客户端中输入:get username ,会提示 (nil)

5.3.4 运行测试类后再在客户端中输入:get username ,即可显示 "zhangsan"

5.4  Jedis操作redis中各种类型的数据结构

 5.4.1 操作字符串类型:string

//string数据结构操作
@Test
public void test2(){
    //1.获取连接
    Jedis jedis = new Jedis();
    //2.操作
    //存储
    jedis.set("username","zhangsan");
    //获取
    String username = jedis.get("username");
    System.out.println(username);

    //可以使用setex()方法存储指定过期时间的key value
    //将activecode:hello键值对存入redis,并且20秒后自动删除该键值对
    jedis.setex("activecode",20,"hello");
    //3.关闭连接
    jedis.close();
}

5.4.2 操作哈希类型:hash

//hash数据结构操作
@Test
public void test3(){
    //1.获取连接
    Jedis jedis = new Jedis();
    //2.操作
    //存储
    jedis.hset("user","name","lisi");
    jedis.hset("user","age","23");
    jedis.hset("user","gender","male");
    //获取
    String name = jedis.hget("user", "name");
    System.out.println(name);

    //获取hash的所有map集合中的数据
    Map<String, String> user = jedis.hgetAll("user");

    Set<String> keySet = user.keySet();
    for (String key : keySet) {
        //获取value
        String value = user.get(key);
        System.out.println(key + ":" + value);
    }
    //3.关闭连接
    jedis.close();
}

5.4.3 操作列表类型:list

//list数据结构操作
@Test
public void test4(){
    //1.获取连接
    Jedis jedis = new Jedis();
    //2.操作
    //存储
    jedis.lpush("mylist","a","b","c");
    jedis.rpush("mylist","a","b","c");

    //范围获取
    List<String> mylist = jedis.lrange("mylist", 0, -1);
    System.out.println(mylist);

    //弹出
    String element1 = jedis.lpop("mylist");
    System.out.println(element1);
    String element2 = jedis.rpop("mylist");
    System.out.println(element2);

    //范围获取
    List<String> mylist2 = jedis.lrange("mylist", 0, -1);
    System.out.println(mylist2);
       
    //3.关闭连接
    jedis.close();
}

5.4.4 操作集合类型:set

//set数据结构操作
@Test
public void test5(){
    //1.获取连接
    Jedis jedis = new Jedis();
    //2.操作
    //存储
    jedis.sadd("myset","java","php","c++");
        
    //获取
    Set<String> myset = jedis.smembers("myset");
    System.out.println(myset);

    //3.关闭连接
    jedis.close();
}

5.4.5 操作有序集合类型:sortedset

//sortedset数据结构操作
@Test
public void test6(){
    //1.获取连接
    Jedis jedis = new Jedis();
    //2.操作
    //存储
    jedis.zadd("mysortedset",3,"亚瑟");
    jedis.zadd("mysortedset",30,"后裔");
    jedis.zadd("mysortedset",25,"孙悟空");

    //获取
    Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
    System.out.println(mysortedset);

    //3.关闭连接
    jedis.close();
}

5.5 jedis连接池 :JedisPool

5.5.1 使用

①创建JedisPool连接池对象

②调用方法 getResource()方法获取Jedis连接

示例:

//Jedis连接池使用
@Test
public void test7(){
    //0.创建一个配置对象
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(50);//设置最大允许的连接数量
    config.setMaxIdle(10);//设置最大的空闲连接

    //1.创建Jedis连接池对象
    JedisPool jedisPool = new JedisPool(config,"localhost",6379);
    //2.获取连接
    Jedis jedis = jedisPool.getResource();
    //3.使用
    jedis.set("hehe","haha");

    //4.关闭连接,归还到连接池中
    jedis.close();
}

5.6 jedis连接池工具类,将配置信息抽取到一个配置文件中

①现在项目中的src目录下创建一个jedis.properties配置文件

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

②创建一个util包,包下创建一个JedisPoolUtils工具类

package jedis.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/*
JedisPool工具类
加载配置文件,配置连接池的参数
提供获取连接的方法
* */
public class JedisPoolUtils {
    private static JedisPool jedisPool;

    static {
        //读取配置文件
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties pro = new Properties();
        //关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
        //初始化JedisPool
        jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));
    }
    //获取连接的方法
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

③写一个测试类,使用JedisPoolUtils工具类

//Jedis连接池工具类使用
@Test
public void test8(){
    //通过连接池工具类获取
    Jedis jedis = JedisPoolUtils.getJedis();
    //使用
    jedis.set("hehe","haha");
    //关闭连接,归还到连接池中
    jedis.close();
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值