Redis学习笔记

1基础

1.1NoSQL

特点:非结构化、无关联、非SQL、没有事务或事务不满足ACID特性、内存存储、支持水平扩展

1.2Redis概括

redis官网:https://redis.io/

一个基于内存的键值型NoSQL数据库

  • key-value型

  • 单线程,每个命令具备原子性

  • 低延迟,速度快(基于内存、IO多路复用、c语言编写)

  • 支持数据持久化

  • 支持主从/分片集群

  • 支持多语言客户端

1.3linux系统安装

  1. 下载redis安装包

    在http://download.redis.io/releases/下载需要的版本,比如6.2.6

  2. 服务器安装gcc依赖

    yum install -y gcc tcl
    
  3. 上传安装包

    上传targz到/usr/local/src目录,解压

  4. 安装

    进入redis目录,执行

    make && make install
    
  5. 检查是否安装成功

    默认安装目录:/usr/local/bin

    Redis学习笔记_第1张图片

1.4修改配置

编辑/usr/local/src/redis-6.2.6/redis.conf

# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes 
# 密码,设置后访问Redis必须输入密码
requirepass 123321

# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"

1.5启动

进入/usr/local/src/redis-6.2.6目录

redis-server redis.conf

用ps -ef |grep redis查看是否启动

用kill停止redis进程

1.6配置开机启动

新建系统服务文件

vi /etc/systemd/system/redis.service

编辑文件

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重载系统服务

systemctl daemon-reload
# 设置开机启动
systemctl enable redis
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis

1.7客户端

  • 命令行

    # 连接
    redis-cli -h 127.0.0.1 -p 6379
    # 输入密码
    auth 密码
    # 检测是否连接
    ping
    # 退出
    exit
    
  • 图形界面

    redis desktop manager, AnotherRedisDesktopManager等等

  • 语言

2命令

key-value型

key一般是String类型

value可以是String, Hash, List, Set, SortedSet, GEO, BitMap, HyperLog类型

命令大全:https://redis.io/commands/

或者命令行输入

help @xxx类型

2.1通用命令

# 查看符合模板的所有key,不要在生产环境使用
keys key
# 删除key,返回删除的key数量
del key
# 判断key是否存在
exists key
# 给一个key设置有效期,到期时自动删除
expire key seconds
# 查看key剩余有效期
ttl key

2.2String类型

value分为3类

  • string:普通字符串

  • int:整数类型

  • float:浮点类型

底层都是字节数组形式存储,最大空间不超过512m

# 添加或修改
set key value
# 获取
get key
# 批量添加
mset k1 v1 k2 v2
# 批量获取
mget k1 k2
# 自增1
incr key
# 自增指定步长
incrby key 步长
# 浮点自增
incrbyfloat key 步长
# 新增
setnx key value
# 新增指定有效期
setex key seconds value

2.3key结构

允许多个单词形成层级结构,单词之间用:隔开

比如用户信息:k1=user:1, k2=user:2

2.4Hash类型

value是无序字典,类似HashMap

# 添加或修改
hset key field value
# 获取
hget key field
# 批量添加
hmset key f1 v1 f2 v2
# 批量获取
hmget key f1 f2
# 获取key所有field,value
hgetall key
# 获取key所有field
hkeys key
# 获取key所有value
kvals key
# 自增指定步长
hincrby key field 步长
# 新增
hsetnx key field value

2.5List类型

与LinkedList类似,可以正向反向检索

# 左侧插入
lpush key value
# 左侧删除并返回左侧第一个
lpop key
# 右侧插入
rpush key value
# 右侧删除并返回右侧第一个
# 返回一段范围的元素
lrange key start end
# 与lpop,rpop类似,没有元素会等待指定时间
blpop key timeout
brpop key timeout

2.6Set类型

与HashSet类似

# 添加
sadd key value
# 删除
srem key value
# 返回个数
scard key
# 判断是否存在
sismember key value
# 获取所有元素
smembers key
# 交集
sinter k1 k2
# 差集
sdiff k1 k2
# 并集
sunion k1 k2

2.7SortedSet类型

与TreeSet类似,每个元素有个score属性,根据score排序

# 添加
zadd key score value
# 删除
zrem key value
# 获取score
zscore key value
# 获取排名
zrank key value
# 获取个数
zcard key
# 统计score在给定范围内的个数
zcount key min max
# 自增
zincrby key 步长 value
# 按照score排序获取指定排名范围的元素
zrange key min max
# 按照score排序获取指定score范围的元素
zrangebyscore key min max
# 差集
zdiff
# 交集
zinter
# 并集
zunion
# 默认升序,降序在z后面加rev,如zrevrange

3Java客户端

  • jedis

    以Redis命令作为方法名称,线程不安全,多线程环境需要基于连接池使用

  • lettuce

    基于Netty实现,支持同步、异步和响应式编程,线程安全,支持哨兵、集群、管道模式

  • Redisson

    基于Redis实现的分布式、可伸缩Java数据结构集合

3.1Jedis

引入依赖

        <dependency>
            <groupId>redis.clientsgroupId>
            <artifactId>jedisartifactId>
            <version>3.7.0version>
        dependency>
public class JedisTest {
    private Jedis jedis;

    @BeforeEach
    void setUp() {
        jedis = new Jedis("ip", 6379);
        jedis.auth("password");
        jedis.select(0);
    }

    @Test
    void name() {
        String result = jedis.set("name", "hhh");
        System.out.println(result);
        String name = jedis.get("name");
        System.out.println(name);
    }

    @AfterEach
    void tearDown() {
        if (jedis != null) {
            jedis.close();
        }
    }
}

Jedis连接池

public class JedisConnectionFactory {
    private static final JedisPool jedisPool;

    static {
        JedisPoolConfig config = new JedisPoolConfig();
        // 最大连接
        config.setMaxTotal(8);
        // 最大空闲连接
        config.setMaxIdle(8);
        // 最小空闲连接
        config.setMinIdle(0);
        // 最长等待时间,单位ms
        config.setMaxWaitMillis(1000);
        jedisPool = new JedisPool(config, "ip", 6379, 1000, "password");
    }

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

3.2SpringDataRedis

引入依赖

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        dependency>

        <dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-pool2artifactId>
        dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
        dependency>
spring:
  redis:
    host: ip
    port: 6379
    password: password
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 1000
@SpringBootTest(classes = RedisDemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RedisTest {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    void name() {
        redisTemplate.opsForValue().set("name", "aaa");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }
}
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置key序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // 设置value序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }
}

StringRedisTemplate

key,value为string类型

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void test() {
        stringRedisTemplate.opsForValue().set("name", "bbb");
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

其它Redis知识:JavaGuide Redis

你可能感兴趣的:(学习笔记,redis)