Redis

本文详细介绍了Redis数据库的特点与应用场景,包括其非关系型特性、数据结构(如字符串、哈希、列表、集合及有序集合),以及如何通过Java客户端Jedis进行操作。此外,还探讨了Redis的两种持久化机制RDB和AOF。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)概念

是一款高性能的nosql系列的菲关系型数据库

菲关系型数据库特点

  1. 数据之间没有关联关系
  2. 数据存储在内存中

一般情况将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据

应用场景

  • 缓存
  • 聊天室在线好友列表
  • 任务队列(秒杀,抢购,12306等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒)
  • 分布式集群架构中的Session分离

redis.windows.conf:配置文件

redis-cli.exe:客户端

redis-server.exe:服务器端

数据结构

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

  • 字符串类型string
  • 哈希类型hash:map格式
  • 列表类型list:Linkedlist
  • 集合类型set:hashset
  • 有序集合类型sortedset

 

 

 

(2)操作

 

  • 字符串类型string

存储:set key value

获取:get key

删除:del key

  • 哈希类型hash

存储:hset key field value

获取:hget key field,hgetall key获取所有的

删除:hdel key field

  • 列表类型list

是简单的字符串列表,按照插入顺序排序,可以在头部(左边)或尾部(右边)添加一个元素

添加:lpush,rpush key value:从列表的左边或右边添加进去

获取:

lrange key start end:范围的获取

删除:

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

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

 

  • 集合类型set

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

SADD key member1 [member2] 向集合添加一个或多个成员

SCARD key 获取集合的成员数

SPOP key 移除并返回集合中的一个随机元素

SUNION key1 [key2] 返回所有给定集合的并集

存储:sadd key value

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

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

参考:https://www.redis.net.cn/tutorial/3511.html

 

  • 有序集合类型sortedset

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

存储:zadd key score value:

获取:zrange key start end

查看分数:zrange key start end withscores

删除:zrem key value

通用命令:

keys *:查询所有键

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

del key:删除指定的key  value

(3)持久化

redis是一个内存数据库,当redis服务器重启,数据会丢失。可以将redis内存中的数据持久化保存到硬盘中。

持久化机制:

1、RDB:默认方式,不需要进行配置。在一定时间间隔汇总,检测key的变化情况,然后持久化数据到

save 900 1

after 900 sec (15 min) if at least 1 key changed
save 300 10

after 300 sec (5 min) if at least 10 keys changed
save 60 10000

after 60 sec if at least 10000 keys changed

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

redis-server.ext reids.windows.conf
 

2、AOF:不推荐使用。日志记录的方式,可以记录每一条命令的操作,每一次命令操作后持久化数据

  • 编辑redis.windows.conf文件
    • appendonly no(关闭aof)改成yes,开启aof
    • # appendfsync always:每一次操作都进行持久化,性能低
      appendfsync everysec:每隔一秒操作一次持久化
      # appendfsync no:不进行持久化

(3)Java客户端 Jedis

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

使用步骤:

  1. 下载Jedis的jar包
  2. 使用
  • //获取连接
  • Jedis jedis = new Jedis(“localhost”,6379);
  • //操作
  • jedis.set("username","zhangshan");
  • //关闭连接
  • jedis.close()

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

导坐标:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>
  • 字符串类型string

set/get

//使用空参构造,默认值就是:"localhost",6379
Jedis jedis = new Jedis("localhost",6379);

jedis.set("username","zhangsan");
//可以使用setex()方法存储可以指定过期时间的key value
//参数key:任意名称,第二参数:时间,单位是秒,第三参数:值
jedis.setex("activatecode",20,"hehah");
//将activatecode:hehah键值对存入redis,并在20秒后自动删除

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

jedis.close();
  • 哈希类型hash:map格式

hset/hget

/**
 * hash数据结构操作
 */
@Test
public void test2(){
    //使用空参构造,默认值就是:"localhost",6379
    Jedis jedis = new Jedis("localhost",6379);

    jedis.hset("user","name","lisi");
    jedis.hset("user","age","23");
    jedis.hset("user","gender","male");

    System.out.println(jedis.hget("user","name"));

    //获取hash的所有map数据
    Map<String,String> user = jedis.hgetAll("user");
    Set<String> keySet = user.keySet();
    for (String key:keySet){
        System.out.println(key + ":" + user.get(key));
    }
    jedis.close();
}
  • 列表类型list:Linkedlist

lpush/rpush

lpop/rpop

lrange start end:范围获取

/**
 * list数据结构操作
 */
@Test
public void test3(){
    //使用空参构造,默认值就是:"localhost",6379
    Jedis jedis = new Jedis("localhost",6379);

    jedis.lpush("mylist","a","b","c");
    jedis.rpush("mylist","a","b","c");

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

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

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

    //获取范围:0 -1:所有的元素
    List<String> mylist2 = jedis.lrange("mylist",0,-1);
    System.out.println(mylist2);

    jedis.close();
}
  • 集合类型set:hashset,不允许重复元素

sadd

smembers

/**
 * set数据结构操作
 */
@Test
public void test4(){
    //使用空参构造,默认值就是:"localhost",6379
    Jedis jedis = new Jedis("localhost",6379);
    
    jedis.sadd("myset","java","php","c++");
    Set<String > myset = jedis.smembers("myset");
    System.out.println(myset);
    
    jedis.close();
}
  • 有序集合类型sortedset

zadd

/**
 * sortedset数据结构操作
 */
@Test
public void test5(){
    //使用空参构造,默认值就是:"localhost",6379
    Jedis jedis = new Jedis("localhost",6379);
//score:分数,应用场景:如英雄的出场次数,关注程度等
    jedis.zadd("mysortedset",12,"亚瑟");
    jedis.zadd("mysortedset",15,"后裔");
    jedis.zadd("mysortedset",25,"孙悟空");

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

    jedis.close();
}

(4)Jedis连接池:JedisPool

使用

  1. 创建JedisPool连接池对象
  2. 调用方法getResource()方法获取连接
/**
 * jedis连接池使用
 */
@Test
public void test6(){
    //创建配置对象
    JedisPoolConfig config = new JedisPoolConfig();
    //最大连接数
    config.setMaxTotal(50);
    //最大空闲连接
    config.setMaxIdle(10);

    //创建Jedis连接池对象
    JedisPool jedisPool = new JedisPool("localhost",6379);

    //获取连接
    Jedis jedis = jedisPool.getResource();

    jedis.set("mylist","hhhh");
    System.out.println(jedis.get("mylist"));

    //连接归还到连接池中
    jedis.close();
}

 

升级,使用工具类

在src下建:jedis.properties文件

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
/**
 * JedisPool工具类
 */
public class JedisPoolUtil {

    private static JedisPool jedisPool;

    static {
        //读取配置文件
        InputStream inputStream = JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties properties = new Properties();
        //关联文件
        try{
            properties.load(inputStream);
        }catch (Exception e){
            e.printStackTrace();
        }

        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config,
                    properties.getProperty("host"),
                    Integer.parseInt(properties.getProperty("port")));



    }

    public static Jedis getJedis(){
        return jedisPool.getResource();
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值