Redis快速入门

Redis介绍

Redis是一个键值数据库,内存数据库,属于AP模型(CAP理论模型)

有四种模式可以部署

  • 单机模式
  • 主从模式
  • 哨兵模式
  • 集群模式

Redis内部使用自己设计的一种文本协议进行客户端与服务端之间的通信-RESP(基于TCP协议实现,采用请求/响应模型)

在集群模式下,Redis会对存储数据进行切片(利用哈希槽进行分片,Redis cluster划分了16384个槽,一个槽对应一个节点,存数据时会先算哈希值,具体来说就是在存取key时,Redis会使用CRC16算法得出一个结果,再对16384取余计算出槽位置)

Redis的优势

  • 基于内存
  • 单线程模型
  • 多路复用IO模型,就是多个线程的IO注册到同一个管道上,这个管道会统一和内核进行交互,当管道中的某一个请求需要的数据准备好之后,进程就把对应的数据拷贝到用户空间中。(分为三种:select、poll、epoll)
  • 高效的数据结构(基本数据结构和高级数据结构)
    • 字符串 String
    • 列表 List
    • 集合 Set
    • 有序集合 Zset
    • 哈希 Hash
    • 流 Stream
    • 位图 Bitmap
    • Geospatial
    • HyperLogLog
  • 多线程的引入(Redis6.0),只是接收网络通信使用了多线程,数据的读写操作还是使用的单线程

Redis安装(Ubuntu)

更新apt

sudo apt update
sudo apt upgrade

安装Redis

sudo apt install redis-server

查看Redis版本

redis-cli --version

查看运行状态

systemctl status redis

配置远程连接

sudo nano /etc/redis/redis.conf 
# #取消注释requirepass 启动密码认证,并设置访问密码
requirepass your-pass-word
# 以守护进程运行Redis 
daemonize yes

ps:需要注意的是,Redis属于键值对数据库,然后键类型是支持所有二进制序列,但是一般都是使用字符串,空字符串也是一个有效的key值,值的类型就是五种基本数据类型加上高级数据类型

命令行操作

Redis默认为16个库

切换库

select db

删除库所有数据

flushdb

查看所有key

keys *

返回存在的key的数量

exists key [key...]

Redis可以给key设置过期时间expire &ttl

expire key 30
ttl key

返回key存储的value数据类型

type key

删除key

del key

字符串 String

# 设置
set key value
# 获取
get key
# 对数字类型加1
incr key
# 对数字类型减1
decr key
# 追加
append key value
# 获取value总长度
strlen key
# 截取value
getrange key start end
# 替换value
setrange key offset value
# 获取多个和设置多个
mset key1 value1 key2 value2
mget key1 key2

哈希 Hash,这里可以这么理解,就相当于创建一个哈希表,键key相当于表的名字,field和value表示哈希表的槽位和数据值

# 新建
hset key field value
# 获取
hget key field
# 设置多个和获取多个
hmset key field1 value1 field2 value2
hmget key field1 field2
# 获取全部
hgetall key
# 删除 hdel
hdel key field
# 获取所有field域
hkeys key
# 获取所有值
hvals key
# 判断filed是否存在
hexists key field

列表 List

# 添加 lpush 和rpush
lpush key value[value..]
rpush key value[value]
# 获取lrange, 负数表示倒数
lrange key start stop
# 获取指定index元素
lindex key index
# 获取列表长度 llen
llen key
# 按值移除元素 lrem
lrem key count value
# 修改某个值 lset
lset key index value
# 插入元素到指定值之前或之后 linsert
linsert key BEFORE|AFTER pivot value

集合Set

# 添加 sadd
sadd key member
# 获取元素 smembers
smembers key
# 判断元素是否存在 sismember
sismember key member
# 获取集合元素个数 scard
scard key
# 删除集合key中的一个或多个元素 srem
srem key member
# 随机删除元素spop
spop key [count]
# 随机取元素 srandmember
srandmember key [count]

有序集合 Zset

# 添加zadd
zadd key score member [score member ..]
# 查询 zrange,WITHSCORES表示是否同时返回score和member
zrange key start stop [WITHSCORES]
# 区间查询 zrevrange,返回值按照score从大到小排序
zrevrange key start stop [WITHSCORES]
# 删除元素 zrem
zrem key member [member]
# 获取元素个数zcard
zcard key

Java操作Redis

工具:IDEA

安装依赖,使用jedis操作

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

初始化对象

@Before
    public void init() {
        this.jedis = new Jedis("192.168.10.129", 6379);
        jedis.auth("12345678");
    }

然后就可以使用jedis对Redis进行操作了

字符串String

@Test
    public void setKey() {
        jedis.set("test", "test");
        System.out.println(jedis.get("test"));
    }
    
@Test
    public void deleteKey() {
        jedis.del("test");
    }

列表List

@Test
    public void testList() {
        // 添加数据
        List<String> temp = Arrays.asList("1", "2", "3");
        Gson gson = new Gson();
        String s = gson.toJson(temp);
        jedis.rpush("testList", s);
        jedis.lpush("testList", "sakura");
        List<String> test = jedis.lrange("testList", 0, -1);
        System.out.println(test);
    }

集合Set

    @Test
    public void testSet() {
        jedis.sadd("testSet", "1", "2", "2");
        System.out.println(jedis.smembers("testSet"));
    }

有序集合Zset

@Test
    public void testZSet() {
        HashMap<String, Double> scoreMap = new HashMap<String, Double>();
        scoreMap.put("xiaoming", 70.0);
        scoreMap.put("xiaowang", 100.0);
        scoreMap.put("xiaohong", 88.0);
        scoreMap.put("xiaoli", 60.0);
        scoreMap.put("zhangsan", 58.0);
        jedis.zadd("math", scoreMap);
        // 查看scoreMap的形式
        System.out.println("查看scoreMap的形式:" + scoreMap);
        // 0 第0个元素,-1最后一个元素
        System.out.println("返回math全部元素:" + jedis.zrange("math", 0, -1));
        System.out.println("查看key有多少个元素:" + jedis.zcard("math"));
        // 移除 xiaoli 这个元素
        System.out.println("移除xiaoli 这个元素");
        jedis.zrem("math", "xiaoli");
        // -inf 负无穷  inf 正无穷,即从小到大排序
        System.out.println("按照递增顺序,返回math全部的元素(含成绩):" + jedis.zrangeByScoreWithScores("math", "-inf", "inf"));
        System.out.println("统计math集合,成绩在[80,100]之间的元素个数:" + jedis.zcount("math", 80, 100));
    }

哈希Hash

@Test
    public void testHash() {
        jedis.hset("testHash", "testField", "testValue");
        System.out.println(jedis.hget("testHash", "testField"));
    }

完整的代码

package com.sakura.test;

import com.google.gson.Gson;
import com.nimbusds.jose.shaded.json.JSONUtil;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class TestRedis {

    public static Jedis jedis;

    @Before
    public void init() {
        this.jedis = new Jedis("192.168.10.129", 6379);
        jedis.auth("12345678");
    }

    @Test
    public void setKey() {
        jedis.set("test", "test");
        System.out.println(jedis.get("test"));
    }

    @Test
    public void deleteKey() {
        jedis.del("test");
    }

    @Test
    public void testList() {
        // 添加数据
        List<String> temp = Arrays.asList("1", "2", "3");
        Gson gson = new Gson();
        String s = gson.toJson(temp);
        jedis.rpush("testList", s);
        jedis.lpush("testList", "sakura");
        List<String> test = jedis.lrange("testList", 0, -1);
        System.out.println(test);
    }

    @Test
    public void testSet() {
        jedis.sadd("testSet", "1", "2", "2");
        System.out.println(jedis.smembers("testSet"));
    }

    @Test
    public void testZSet() {
        HashMap<String, Double> scoreMap = new HashMap<String, Double>();
        scoreMap.put("xiaoming", 70.0);
        scoreMap.put("xiaowang", 100.0);
        scoreMap.put("xiaohong", 88.0);
        scoreMap.put("xiaoli", 60.0);
        scoreMap.put("zhangsan", 58.0);
        jedis.zadd("math", scoreMap);
        // 查看scoreMap的形式
        System.out.println("查看scoreMap的形式:" + scoreMap);
        // 0 第0个元素,-1最后一个元素
        System.out.println("返回math全部元素:" + jedis.zrange("math", 0, -1));
        System.out.println("查看key有多少个元素:" + jedis.zcard("math"));
        // 移除 xiaoli 这个元素
        System.out.println("移除xiaoli 这个元素");
        jedis.zrem("math", "xiaoli");
        // -inf 负无穷  inf 正无穷,即从小到大排序
        System.out.println("按照递增顺序,返回math全部的元素(含成绩):" + jedis.zrangeByScoreWithScores("math", "-inf", "inf"));
        System.out.println("统计math集合,成绩在[80,100]之间的元素个数:" + jedis.zcount("math", 80, 100));
    }

    @Test
    public void testHash() {
        jedis.hset("testHash", "testField", "testValue");
        System.out.println(jedis.hget("testHash", "testField"));
    }


}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值