Redis基本应用及Java代码实现

开发环境

JDK 1.8.0

Intellij Ideal

Redis 64.3.0.503

https://github.com/ServiceStack/redis-windows/tree/master/downloads

Redis Desktop Manager

https://redisdesktop.com/

 

Redis安装及连接工具

数据库的安装

下载最新版的redit的zip包,直接解压。

为了方便启动,我们可以在目录下新建 startup.cmd, 写入如下内容保存。然后双击启动即可。

redis-server redis.windows.conf

看到如下信息即为连接成功。默认开放6379端口。

 

用工具Redis Desktop Manager连接

左上角 Connect to Redis Server, 输入name, 本机ip地址和端口号,其他不需要的地方可以保持默认。

连接成功后会在左侧打开db,默认每个连接打开16个.

默认会连接db0,如果想要连接其他 如db2,请使用命令  select 2

*注:

不使用工具,也可以用redits自带的工具连接。

在同路径下的 redis-cli.exe

 

基本配置说明

它的配置文件在文件路径下 redis.windows.conf

#这里就是设置密码,你可以设置成任何值
requirepass anything

#这里可以改变默认端口
port 6379

#绑定ip地址
bind 127.0.0.1

#设置默认db数量。
databases 16

#指定默认数据库名称
dbfilename dump.rdb

#指定本地存放路径
dir ./

数据库操作

数据类型

String类型:
它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。

哈希类型:
该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。


列表类型:
该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。

集合类型:
Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。
Set类型主要应用于:在某些场景,如社交场景中,通过交集、并集和差集运算,通过Set类型可以非常方便地查找共同好友、共同关注和共同偏好等社交关系。

顺序集合类型:
ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,其底层也是通过哈希表实现的。

 

基本操作

这里只列举string类型和 list类型:

String类型:

设置键为name值为itcast的数据
set name itcast

设置键值为aa,值为bb,及过期时间,以秒为单位
setex aa 3 bb

设置过期时间,以秒为单位
设置键'a1'的过期时间为3秒
expire 'a1' 3

查看有效时间,以秒为单位
ttl key

设置多个键值
mset a1 python a2 java a3 c

追加值
向键为a1中追加值' haha'
append 'a1' 'haha'

获取
获取键值为name的值,如果不存在此键则返回null
get 'name'

多个键获取多个值
获取键a1、a2、a3'的值
mget a1 a2 a3 

删除键及对应的值
del a2 a3
 

List类型:
增加
lpush key value1 value2 ...
例1:从键为'a1'的列表左侧加入数据a 、 b 、c
lpush a1 a b c

在右侧插入数据
rpush key value1 value2 ...
例2:从键为'a1'的列表右侧加入数据0 1
rpush a1 0 1

在指定元素的前或后插入新元素
linsert key before或after 现有元素 新元素
例3:在键为'a1'的列表中元素'b'前加'3'
linsert a1 before b 3

获取
返回列表,指定范围内的元素
start、stop为元素的下标索引
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
lrange key start stop
例4:获取键为'a1'的列表所有元素
lrange a1 0 -1

设置指定索引位置的元素值
索引从左侧开始,第一个元素为0
索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
lset key index value
例5:修改键为'a1'的列表中下标为1的元素值为'z'
lset a 1 z

删除
删除指定元素
将列表中前count次出现的值为value的元素移除
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有
lrem key count value
例6.1:向列表'a2'中加⼊元素'a'、'b'、'a'、'b'、'a'、'b'
lpush a2 a b a b a b


从'a2'列表右侧开始删除2个'b'
lrem a2 -2 b

查看
查看列表'py12'的所有元素
lrange a2 0 -1
 

其他命令请参考

String类型GET/MGET
SET/SETEX/MSET/MSETNX
INCR/DECR
GETSET
DEL
哈希类型HGET/HMGET/HGETALL
HSET/HMSET/HSETNX
HEXISTS/HLEN
HKEYS/HDEL
HVALS
列表类型LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
LINDEX/LRANGE
LLEN/LTRIM
集合类型SADD/SPOP/SMOVE/SCARD
SINTER/SDIFF/SDIFFSTORE/SUNION
顺序集合类型ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
ZINTER/ZDIFF/ZDIFFSTORE/ZUNION

 

redis原子计数器

它是redis自带的应对系统高并发请求的计数器。

例子

MyLocal:0>incr num #key被初始化
"1"
MyLocal:0>incr num #存储值增一
"2"
MyLocal:0>get num  #数字值在 Redis 中以字符串的形式保存
"2"

其他相关的还有:

incr递增1并返回递增后的结果;
incrby根据指定值做递增或递减操作并返回递增或递减后的结果(incrby递增或递减取决于传入值的正负);
decr递减1并返回递减后的结果;
decrby根据指定值做递增或递减操作并返回递增或递减后的结果(decrby递增或递减取决于传入值的正负);

*后面java代码会做一个redit的并发测试。

 

Java代码连接Redis

在maven中添加

    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
    </dependencies>

基本查询操作

package com;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;

import java.util.*;

public class NewApp {
    public static void main(String[] args) {
        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost",6379);
        jedis.select(2);
        System.out.println("连接成功");
        // 查看服务是否运行
        System.out.println("服务正在运行: " + jedis.ping());

        jedis.set("城市2", "南京");
        String city = jedis.get("城市");

        jedis.lpush("tc", "南京");
        jedis.lpush("tc", "上海");
        jedis.lpush("tc", "苏州");
        jedis.lpush("tc", "北京");
        jedis.lpush("tc", "南通");
        List<String> arr = jedis.lrange("tc", 0, 100);
        System.out.println(arr.size());
        for (String string : arr) {
            System.out.println(string);
        }

        //Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
        //这里要求的是map必须是key和value都是string类型的
        Map<String, String> map=new HashMap<>();
        map.put("name", "小明");
        map.put("age", "13");
        map.put("sex", "男");
        map.put("height", "174");

        //调用jedis的hmset(存入hash map)的方法将map的键值对存进去
        jedis.hmset("people", map);

        //新建一个string类型的数组,用于存当时存入redis的map的key值
        String[] arr2=new String[4];
        arr2[0]="name";
        arr2[1]="age";
        arr2[2]="sex";
        arr2[3]="height";

        //利用jedis的hmget方法,从数据库中依次取出对应的map的key值
        List<String> list2 = jedis.hmget("people",arr2);
        for (int i = 0; i < arr2.length; i++) {
            System.out.println("存入键值对为:"+arr2[i]+"--"+list2.get(i));
        }

        //使用list存入数据
        List<String> list=new ArrayList<>();
        list.add("北京");
        list.add("南京");
        list.add("上海");
        list.add("北京");
        list.add("北京");
        list.add("上海");
        list.add("苏州");
        list.add("南京");
        //打印源数据
        System.out.println("源数据为"+list);

        //因为jedis的sadd的方法,存入的是一个数组对象或者多数据,所有将集合对象转换成数组对象
        String[] arr3=new String[list.size()];
        for (int i = 0; i < arr3.length; i++) {
            arr3[i]=list.get(i);
        }

        //调用sadd方法存入数据库
        jedis.sadd("city", arr3);

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

        System.out.println(smembers);

        Map<String, Double> map2=new HashMap<>();
        map2.put("北京", 1.0);
        map2.put("北京", 2.0);
        map2.put("南京", 3.0);
        map2.put("上海", 4.0);
        map2.put("上海", 5.0);
        map2.put("南京", 6.0);

        //调用jedis的zadd方法存入
        jedis.zadd("city2", map2);

        //索引在0,到10之间的,分数由高到底的取出所有的集合
        Set<String> zrevrange = jedis.zrevrange("city2", 0, 10);
        System.out.println(zrevrange);

    }
}

redis原子计数器操作

package com;

import redis.clients.jedis.Jedis;

import java.util.concurrent.CountDownLatch;

public class MultipleDecrIncr {

    /** decr线程数量 */
    /** 因为这里增加了10次,减少了9次,最后计数器里是1 */
    private static final int DECR_THREAD_COUNT = 9;
    /** incr线程数量 */
    private static final int INCR_THREAD_COUNT = 10;

    private static CountDownLatch begin = new CountDownLatch(DECR_THREAD_COUNT + INCR_THREAD_COUNT);

    private static CountDownLatch finish = new CountDownLatch(DECR_THREAD_COUNT + INCR_THREAD_COUNT);

    static final String KEY = "string:decr:incr";


    public static void main(String[] args) throws InterruptedException {

        for(int i = 0; i < DECR_THREAD_COUNT; ++i) {
            new DecrThread().start();
            //begin.countDown();
        }

        for(int i = 0; i < INCR_THREAD_COUNT; ++i) {
            new IncrThread().start();
            //begin.countDown();
        }
    }

    /**
     * decr命令线程
     */
    static class DecrThread extends Thread {
        @Override
        public void run() {
            //JedisConnect jedisConnect = JedisConnect.getJedisConnect();
            Jedis jedis = new Jedis("localhost",6379);
            jedis.decr(KEY);
            System.out.println("DecrThread");
        }
    }

    /**
     * incr命令线程
     */
    static class IncrThread extends Thread {

        @Override
        public void run() {

            try {
//                begin.await();
            //} catch (InterruptedException e) {
            } catch (Exception e) {
                e.printStackTrace();
            }
            Jedis jedis = new Jedis("localhost",6379);
            jedis.incr(KEY);
            System.out.println("IncrThread");
//            finish.countDown();
        }

    }

    public static class MyThread extends Thread {
        public void run() {
            System.out.println("MyThread.run()");
        }
    }

}

感谢:

老皮肉

https://www.cnblogs.com/sheseido/p/11243341.html

葡萄城

https://www.cnblogs.com/powertoolsteam/p/redis.html

我没有三颗心脏

https://www.jianshu.com/p/56999f2b8e3b

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值