23 redis&jedis(java操作redis)

本文深入探讨了Redis作为NoSQL数据库的功能与应用场景,包括缓存、聊天室在线列表、任务队列等。同时,详细介绍了Jedis作为Java操作Redis的客户端库的使用方法,涵盖了各种数据结构如String、Hash、List、Set、Sorted Set的操作。

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

一、redis

 

认识nosql:

    不支持sql语句来操作数据库,而是需要用特定的语法来操作数据库

1、关系型和非关系型数据库比较

 

2.redis存储数据的类型                                                                                                                            

    1.key-value型数据库

        key:必须是String

        value可以是以下四种:

            1) 字符串类型 string-------------------------->String

            2) 哈希类型 hash    --------------------------->map

            3) 列表类型 list       --------------------------->支持重复元素

            4) 集合类型 set       --------------------------->不允许重复元素

            5) 有序集合类型 sortedset      ---------------->不允许重复元素,且元素有顺序

    2. redis的应用场景

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

            •    聊天室的在线好友列表

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

            •    应用排行榜

            •    网站访问统计

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

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

    redis       中文网:http://www.redis.net.cn/

 

3.redis常用命令操作                                                                                                                                                            

2. 字符串类型 string

        1. 存储: set key value

            127.0.0.1:6379> set username zhangsan

            OK

        2. 获取: get key

            127.0.0.1:6379> get username

            "zhangsan"

        3. 删除: del key

            127.0.0.1:6379> del age

            (integer) 1

3. 哈希类型 hash

        1. 存储: hset key field value

            127.0.0.1:6379> hset myhash username lisi

            (integer) 1

            127.0.0.1:6379> hset myhash password 123

            (integer) 1

        2. 获取:

            * hget key field: 获取指定的field对应的值

                127.0.0.1:6379> hget myhash username

                "lisi"

            * hgetall key:获取所有的field和value

                127.0.0.1:6379> hgetall myhash

                1) "username"

                2) "lisi"

                3) "password"

                4) "123"

                

        3. 删除: hdel key field

            127.0.0.1:6379> hdel myhash username

            (integer) 1

    

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

        1. 添加:

            1. lpush key value: 将元素加入列表左表

                

            2. rpush key value:将元素加入列表右边

                

                127.0.0.1:6379> lpush myList a

                (integer) 1

                127.0.0.1:6379> lpush myList b

                (integer) 2

                127.0.0.1:6379> rpush myList c

                (integer) 3

        2. 获取:

            * lrange key start end :范围获取

                127.0.0.1:6379> lrange myList 0 -1         -------------->0  -1 代表获取所有

                1) "b"

                2) "a"

                3) "c"

        3. 删除:

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

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

5. 集合类型 set : 不允许重复元素

        1. 存储:sadd key value

            127.0.0.1:6379> sadd myset a

            (integer) 1

            127.0.0.1:6379> sadd myset a

            (integer) 0

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

            127.0.0.1:6379> smembers myset

            1) "a"

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

            127.0.0.1:6379> srem myset a

            (integer) 1

 

 

 

 6. 有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

 

        1. 存储:zadd key score value

            127.0.0.1:6379> zadd mysort 60 zhangsan

            (integer) 1

            127.0.0.1:6379> zadd mysort 50 lisi

            (integer) 1

            127.0.0.1:6379> zadd mysort 80 wangwu

            (integer) 1

        2. 获取:zrange key start end [withscores]

            127.0.0.1:6379> zrange mysort 0 -1

            1) "lisi"

            2) "zhangsan"

            3) "wangwu"

 

            127.0.0.1:6379> zrange mysort 0 -1 withscores

            1) "zhangsan"

            2) "60"

            3) "wangwu"

            4) "80"

            5) "lisi"

            6) "500"

        3. 删除:zrem key value

            127.0.0.1:6379> zrem mysort lisi

            (integer) 1

 

    7. 通用命令

        1. keys * : 查询所有的键

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

        3. del key:删除指定的key value

 

4.redis持久化                                                                                                                                                                        

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

2. redis持久化机制:

        1. RDB:默认方式,不需要进行配置,默认就使用这种机制

            * 在一定的间隔时间中,检测key的变化情况,然后持久化数据

            1. 编辑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

                

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

                D:\JavaWeb2018\day23_redis\资料\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf    

            

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

            1. 编辑redis.windwos.conf文件

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

                

                # appendfsync always : 每一次操作都进行持久化

                appendfsync everysec : 每隔一秒进行一次持久化

                # appendfsync no     : 不进行持久化

 

二、Jedis                                                                                                                            

 

 1.   Jedis: 一款java操作redis数据库. --------->和jdbc作用相似

     使用步骤:

        1. 下载jedis的jar包

        2. 使用

            //1. 获取连接

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

            //2. 操作

            jedis.set("username","zhangsan");

            //3. 关闭连接

            jedis.close();

 

  2.  jedis操作redis

        1.string 数据结构操作

 /**

     * jedis快速入门,

     * string 数据结构操作

     */

    @Test

    public void testString(){

        //获取连接

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

        //操作数据

        jedis.set("name","zhangsan" );

        //设置指定时间过期,10秒后

        jedis.setex("age", 10, "18");

        String name = jedis.get("name");

        System.out.println(name);

        //释放资源

        jedis.close();

    }

 

        2.hash 数据结构操作

 

 /**

     * hash 数据结构操作

     */

    @Test

    public void testHash(){

        //1. 获取连接

        Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口

        //2.存储hash

        jedis.hset("user", "name", "wutegang");

        jedis.hset("user", "age", "25");

        jedis.hset("user", "gender", "男");

        //3.获取hash

        System.out.println(jedis.hget("user","age" ));//25

        //4.获取user所有数据

        Map<String, String> userMap = jedis.hgetAll("user");

        //5.遍历

        Set<String> set = userMap.keySet();

        for (String key : set) {

            System.out.println(key+":"+userMap.get(key));

        }

        //6.关闭连接

        jedis.close();

    }

 

    3.list 数据结构操作

 /**

     * list 数据结构操作

     */

    @Test

    public void testList(){

        //1. 获取连接

        Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口

        jedis.lpush("list","a","b","c");//从左边开始存入----------->注意存覆盖

        jedis.rpush("list","a","b","c");//从右边开始存入----------->注意存覆盖

        //0,-1  获取所有

        List<String> list = jedis.lrange("list", 0, -1);

        System.out.println(list);

        //获取指定范围元素

        List<String> list1 = jedis.lrange("list", 0, 2);//获取索引0 1 2 号元素

        System.out.println(list1);

        // list 删除最左边元素,并弹出删除的元素

        String element1 = jedis.lpop("list");

        System.out.println(element1);

        // list 删除最右边元素,并弹出删除的元素

        String element2 = jedis.rpop("list");

        System.out.println(element2);

    }

 

list 数据结构操作图解

 

    4.set 数据结构操作

 /**

     * set 数据结构操作

     */

    @Test

    public void testSet(){

        //1. 获取连接

        Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口

        //2.存储

        jedis.sadd("set","java","c++","pht");

        //3.获取

        Set<String> set = jedis.smembers("set");

        for (String s : set) {

            System.out.println(s);

        }

        //关闭连接

        jedis.close();

    }

 

    5.sortedset 数据结构操作

 

 /**

     * sortedset 数据结构操作

     */

    @Test

    public void testSortedset(){

        //1. 获取连接

        Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口

        //2.存储数据,会按照第二个参数大小进行排序

        jedis.zadd("sortedset", 5,"zhangsan" );

        jedis.zadd("sortedset", 2,"lisi" );

        jedis.zadd("sortedset", 3,"wangwu" );

        //3.获取指定范围数据

        Set<String> sortedset = jedis.zrange("sortedset", 0, 1);

        for (String s : sortedset) {

            System.out.println(s);

        }

    }

 

 

三、jedis连接池工具类                                                                                                            

 

1.   jedis.properties配置文件

host=127.0.0.1

port=6379

maxTotal=50

maxIdle=10

##最大活动对象数

#redis.pool.maxTotal=1000

##最大能够保持idel状态的对象数

#redis.pool.maxIdle=100

##最小能够保持idel状态的对象数

#redis.pool.minIdle=50

##当池内没有返回对象时,最大等待时间

#redis.pool.maxWaitMillis=10000

##当调用borrow Object方法时,是否进行有效性检查

#redis.pool.testOnBorrow=true

##当调用return Object方法时,是否进行有效性检查

#redis.pool.testOnReturn=true

##“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.

#redis.pool.timeBetweenEvictionRunsMillis=30000

##向调用者输出“链接”对象时,是否检测它的空闲超时;

#redis.pool.testWhileIdle=true

## 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.

#redis.pool.numTestsPerEvictionRun=50

##redis服务器的IP

#redis.ip=xxxxxx

##redis服务器的Port

#redis1.port=6379

2.JedisPoolUtils

package cn.itcast.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;

/**

 * jedis连接池工具类

 * 1.加载配置文件,设置配置参数

 * 2.提供获取连接的方法

 */

public class JedisPoolUtils {

    private static JedisPool jedisPool;

    //加载配置文件,使用Properties对象

    static {

        InputStream inputStream = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");

        //创建Properties对象

        Properties pro = new Properties();

        try {

            //读取资源

            pro.load(inputStream);

        } catch (IOException e) {

            e.printStackTrace();

        }

        //获取 jedis.properties配置文件,设置到JedisPoolConfig

        JedisPoolConfig config = new JedisPoolConfig();

        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));

        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //创建连接池对象

        jedisPool = new JedisPool(config,pro.getProperty("host") , Integer.parseInt(pro.getProperty("port")));

    }

    //获取连接对象的方法

    public static Jedis getJedis(){

        return  jedisPool.getResource();

    }

}

 

3.JedisPoolUtilsTest(使用junit单元测试,连接池对象是否正确)

 

package cn.itcast.jedis.util;

import org.junit.Test;

import redis.clients.jedis.Jedis;

public class JedisPoolUtilsTest {

    @Test

    public void testPool(){

        //获取连接对象jedis

        Jedis jedis = JedisPoolUtils.getJedis();

        jedis.set("name", "aaa");

        String name = jedis.get("name");

        System.out.println(name);

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值