redis_study

下载docker 的桌面化工具dockerDesktop

https://www.docker.com/products/docker-desktop/windows docker安装chemex windows docker安装部署Redis_docker
下载windows版本,安装

windows docker安装chemex windows docker安装部署Redis_序列化_02


添加一个redis服务

查看docker中运行的虚拟机,连接redis

windows docker安装chemex windows docker安装部署Redis_redis_03

1.docker ps     查看docker中运行的虚拟机
2.docker exec -it myRedis bash   选在连接的虚拟机
3.redis-cli [options] [commonds]		启动
    -h  默认 127.0.0.1
    -p  默认 6379
    -a  指定redis访问密码
ping

常用命令

help [command] 获取帮助,查看命令用法  

keys   查看符合模板的所有key
del    删除指定的key
exists 判断key是否存在
expire 给一个key设置有效期,到期自动删除,单位为s
ttl    查看key的有效时间
flushdb和flushall命令删除所有key。


Redis常用命令集
1)连接操作命令

quit:关闭连接(connection)
auth:简单密码认证
help cmd: 查看cmd帮助,例如:help quit
2)持久化

save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务

3)远程服务控制

info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器

4)对value操作的命令

exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key

5)String

set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串

6)List 

rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

7)Set

sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素

8)Hash

hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field 
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

IDEA 连接Redis

  1. 官网下载redis,找到配置文件Redis.conf 修改如下内容
bind 127.0.0.1 #注释掉这部分,使redis可以外部访问
 daemonize yes#用守护线程的方式启动
 requirepass 密码#给redis设置密码
 appendonly yes#redis持久化  默认是no
 tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
  1. 选择一块存储区域,存放配置文件

windows docker安装chemex windows docker安装部署Redis_序列化_04

windows docker安装chemex windows docker安装部署Redis_序列化_05


data文件存放 redis持久化的数据,做数据备份

3.启动docker,创建redis服务

truedei@truedei:~$ sudo docker run -p 6379:6379 --name redis -v /data/redis/redis.conf:/etc/redis/redis.conf  -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

-p 6379:6379:把容器内的6379端口映射到宿主机6379端口
-v /data/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
-v /data/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
–appendonly yes:redis启动后数据持久化
docker run --name myRedis2 -p 6379:6379 -v /D/docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /D/docker/redis/data:/data/ -d redis:latest redis-server /etc/redis/redis.conf --appendonly yes

4.启动情况

windows docker安装chemex windows docker安装部署Redis_redis_06

5.idea到入redis依赖

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

6.建立连接

//创建一个工具类用来获取 Jedis 对象
public class JedisConnectionFactory {
    private static final JedisPool jedisPool;
    static {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(8);//最大连接数
        poolConfig.setMaxIdle(8);//最大空闲连接
        poolConfig.setMinIdle(0);//最小空闲连接
//        poolConfig.setMaxWait(new Duration(0, 0));
        poolConfig.setMaxWaitMillis(10000);
        jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379,1000,"chen.g0603");

    }

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

SpringDataRedis

1.引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.配置文件

spring: 
    redis:
        host: 127.0.0.1
        port: 6379
        password: chen.g0603
        lettuce:
            pool: 
                max-active: 8
                max-idle: 8
                min-idle: 0
                max-wait: 100

3,注入RedisTemplate

@AutoWired
private RedisTemplate redisTemplate;

4.测试连接

@AutoWired
private RedisTemplate redisTemplate;

@Test
void testString(){  
    redisTemplate.opsForValue().set("name","tom");
    Object name = redisTemplate.opsForValue().get("name");
    System.out.println(name);
}

5.数据存储被序列化,需要进行转码减少存储信息,实现全自动序列化和反序列化
但是存储了类的字节码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PrpCdfxT-1657423929216)(vx_images/308332309239879.png)]

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate (RedisConnectionFactory connectionFactory){
        //创建redistemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //创建json序列化工具
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置value的序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }
}

6.因为SpringDataRedis中有包装好的 StringRedisTemplate 他的key和value的序列化默认为string 减少了序列化存储的空间但是需要自己手动的进行反序列化

@Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    @Test
    void testStringRedisTemplate(){
        String user = JSON.toJSONString(new User("tom", 212));
        System.out.println("user-->JSON:::>"+user);
        stringRedisTemplate.opsForValue().set("user:101",user);
        String s = stringRedisTemplate.opsForValue().get("user:101");
        System.out.println("get-->redis :user::::>"+s);
        User user1 = JSON.parseObject(s, User.class);
        System.out.println("JSON-->User:::>"+user1);
    }