仿牛客社区项目4.1,4.2——Redis入门、Spring整合Redis

在这里插入图片描述

1、常用命令:

登录客户端``
选择库(16个 index为0-15)select 1
清空当前数据库所有的key flushdb

redis-cli //登录客户端
select 1 //选择库(16个 index为0-15)
flushdb //清空当前数据库所有的key
keys * //查看所有的key
type test:user //查看值的类型
exists test:user //查看是否有key
del test:user //删key
expire test:students 10 //10后删除这个key

字符串strings

set test:count 1 
get test:count
incr test:count // 加1
decr test:count // 减1

哈希hash

hset test:user id 1
hset test:user username zhangsan
hget test:user id

列表lists, 进从两边都可以,出从两边也都可以。

lpush test:ids 101 102 103 // 左进 先进101,然后102,最后103;因为左进,103的索引是0,101的索引是2
llen test:ids // 长度
lindex test:ids 2 // 查看index=2的值
lrange test:ids 0 2 // 查看index0-2的值
rpop test:ids // 右出pop

在这里插入图片描述

集合sets

sadd test:teachers aaa bbb ccc ddd eee
scard test:teachers // 查看有几个
spop test:teachers // 因为无序,随机pop
smembers test:teachers // 查看有哪些元素

在这里插入图片描述
Spring

有序集合sorted sets,有序给权重score,小的排前面,相当于有索引

zadd test:students 10 aaa 20 bbb 30 ccc 40 ddd 50 eee
zcard test:students // 集合里有几个元素
zscore test:students ccc // 查看score
zrank test:students ccc // 查看rank,越小越小,从0开始
zrange test:students 0 2 //rank范围

在这里插入图片描述

2、Spring整合Redis

在这里插入图片描述
配置Redis数据库参数: application.properties

# RedisProperties,其他有默认值,这三个必须配
spring.redis.database=11
spring.redis.host=localhost
spring.redis.port=6379

编写配置类RedisConfig ,构造RedisTemplate

@Configuration
public class RedisConfig {

    @Bean//定义第三方bean,通过redisTemplate访问Redis
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        // 访问数据库,需要注入连接,方法上声明参数,这个参数就被容器装配了

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 存到数据库指定序列化方式,key-value(key序列化方式,value序列化方式,hash自己又有key value)
        template.setKeySerializer(RedisSerializer.string());// 设置key的序列化方式
        template.setValueSerializer(RedisSerializer.json());// 设置value的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());// 设置hash的key的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());// 设置hash的value的序列化方式

        // 触发生效
        template.afterPropertiesSet();
        return template;
   

访问Redis,测试类RedisTests

5中value数据类型:

redisTemplate.opsForValue()
redisTemplate.opsForHash()
redisTemplate.opsForList()
redisTemplate.opsForSet()
redisTemplate.opsForZSet()
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class RedisTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testStrings() {
        String redisKey = "test:count";

        redisTemplate.opsForValue().set(redisKey, 1);

        System.out.println(redisTemplate.opsForValue().get(redisKey));
        System.out.println(redisTemplate.opsForValue().increment(redisKey));
        System.out.println(redisTemplate.opsForValue().decrement(redisKey));
    }

    @Test
    public void testHashes() {
        String redisKey = "test:user";

        redisTemplate.opsForHash().put(redisKey, "id", 1);
        redisTemplate.opsForHash().put(redisKey, "username", "zhangsan");

        System.out.println(redisTemplate.opsForHash().get(redisKey, "id"));
        System.out.println(redisTemplate.opsForHash().get(redisKey, "username"));
    }

    @Test
    public void testLists() {
        String redisKey = "test:ids";

        redisTemplate.opsForList().leftPush(redisKey, 101);
        redisTemplate.opsForList().leftPush(redisKey, 102);
        redisTemplate.opsForList().leftPush(redisKey, 103);

        System.out.println(redisTemplate.opsForList().size(redisKey));
        System.out.println(redisTemplate.opsForList().index(redisKey, 0));
        System.out.println(redisTemplate.opsForList().range(redisKey, 0, 2));

        System.out.println(redisTemplate.opsForList().leftPop(redisKey));
        System.out.println(redisTemplate.opsForList().leftPop(redisKey));
        System.out.println(redisTemplate.opsForList().leftPop(redisKey));
    }

    @Test
    public void testSets() {
        String redisKey = "test:teachers";

        redisTemplate.opsForSet().add(redisKey, "刘备", "关羽", "张飞", "赵云", "诸葛亮");

        System.out.println(redisTemplate.opsForSet().size(redisKey));
        System.out.println(redisTemplate.opsForSet().pop(redisKey));
        System.out.println(redisTemplate.opsForSet().members(redisKey));
    }

    @Test
    public void testSortedSets() {
        String redisKey = "test:students";

        redisTemplate.opsForZSet().add(redisKey, "唐僧", 80);
        redisTemplate.opsForZSet().add(redisKey, "悟空", 90);
        redisTemplate.opsForZSet().add(redisKey, "八戒", 50);
        redisTemplate.opsForZSet().add(redisKey, "沙僧", 70);
        redisTemplate.opsForZSet().add(redisKey, "白龙马", 60);

        System.out.println(redisTemplate.opsForZSet().zCard(redisKey));
        System.out.println(redisTemplate.opsForZSet().score(redisKey, "八戒"));
        System.out.println(redisTemplate.opsForZSet().reverseRank(redisKey, "八戒"));
        System.out.println(redisTemplate.opsForZSet().reverseRange(redisKey, 0, 2));
    }

测试keys

redisTemplate.delete
redisTemplate.hasKey
redisTemplate.expire
    @Test
    public void testKeys() {
        redisTemplate.delete("test:user");

        System.out.println(redisTemplate.hasKey("test:user"));

        redisTemplate.expire("test:students", 10, TimeUnit.SECONDS);
    }

绑定redisKey,不用每次都写:

    // 批量发送命令,节约网络开销.
    @Test
    public void testBoundOperations() {
        String redisKey = "test:count";
        BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
        operations.increment();
        operations.increment();
        operations.increment();
        operations.increment();
        operations.increment();
        System.out.println(operations.get());
    }

编程式事务:
关系型数据库是ACID的,Redis不是的,Redis把命令存到队列中,在事务提交之后才会传给服务器,服务器再统一批量查询。所以在事务未提交时,不会立刻返回结果。

Spring支持编程式事务和声明式事务。声明式事务简单,可以通过配置和注解的方式实现,但是只能精确到方法,以整个方法为单位作为事务。而想要多一个方法里面的某几句命令不能实现,所以声明式事务并不常用,通常使用编程式事务 。手动写,启用事务和提交事务。

    // 编程式事务
    @Test
    public void testTransaction() {
        Object result = redisTemplate.execute(new SessionCallback() {
            @Override
            public Object execute(RedisOperations redisOperations) throws DataAccessException {
                String redisKey = "text:tx";

                // 启用事务
                redisOperations.multi();
                redisOperations.opsForSet().add(redisKey, "zhangsan");
                redisOperations.opsForSet().add(redisKey, "lisi");
                redisOperations.opsForSet().add(redisKey, "wangwu");

                System.out.println(redisOperations.opsForSet().members(redisKey));// 事务中查询,没有返回值

                // 提交事务
                return redisOperations.exec();
            }
        });
        System.out.println(result);
    }

第一行先返回的空,是因为在事务中查询,没有返回值。
第二行提交事务之后,有返回值,先返回每句话修改的行数,再返回新增的value。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值