Redis的基本操作

环境连接

windows环境下连接redis,通过cmd命令输入redis-cli连接,输入密码通过auth命令
redis-cli

C:\Users\Administrator>redis-cli
127.0.0.1:6379>

auth

127.0.0.1:6379> auth 123456
OK

keys* 查看当前redis数据库中存储的所有键

127.0.0.1:6379> keys *
1) "key"
2) "name"
3) "count"

redis数据类型

  • String
  • List
  • Set
  • Hash
  • ZSet

String数据类型指令

存储键值:set key value

127.0.0.1:6379> set name lya
OK

获取值:get key

127.0.0.1:6379> get name
"lya"

拼接字符串:append key value

127.0.0.1:6379> append name wq
(integer) 5
127.0.0.1:6379> get name
"lyawq"

获取字符串长度:strlen key

127.0.0.1:6379> strlen name
(integer) 5

自增值:incr(实现类似JAVA中的i++操作)

127.0.0.1:6379> set count 0
OK
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> get count
"1"
127.0.0.1:6379> incr count
(integer) 2
127.0.0.1:6379> get count
"2"

自减值:decr

127.0.0.1:6379> get count
"2"
127.0.0.1:6379> decr count
(integer) 1
127.0.0.1:6379> get count
"1"

自增设置步长:incrby

127.0.0.1:6379> get count
"1"
127.0.0.1:6379> incrby count 10
(integer) 11
127.0.0.1:6379> get count
"11"

获取范围字符串:getrange如果end值为-1,则获取全部字符

127.0.0.1:6379> getrange name 0 3
"lyaw"
127.0.0.1:6379> getrange name 0 -1
"lyawq"

将指定索引的字符更换:setrange如下,将valueNameafter中的“N”更换为example

127.0.0.1:6379> getrange name 0 -1
"lyawq"
127.0.0.1:6379> setrange name 3 szm
(integer) 6
127.0.0.1:6379> get name
"lyaszm"

setex如果存在key,则设置此key有效时长为10s,值为abc

127.0.0.1:6379> keys *
1) "name"
2) "count"
127.0.0.1:6379> set key 2
OK
127.0.0.1:6379> keys *
1) "key"
2) "name"
3) "count"
127.0.0.1:6379> setex key 10 abc
OK
127.0.0.1:6379> keys *
1) "key"
2) "name"
3) "count"
127.0.0.1:6379> keys *
1) "name"
2) "count"

setnx如果不存在key,则设置值为abc

127.0.0.1:6379> setnx key1 abc
(integer) 1

设置key的有效时长,expirettl

127.0.0.1:6379> expire count 30
(integer) 1
127.0.0.1:6379> get count
"11"
127.0.0.1:6379> ttl count      #查询有效时长
(integer) 18
127.0.0.1:6379> ttl count
(integer) -2							# -2代表过期
127.0.0.1:6379> get count
(nil)

插入对象类型

127.0.0.1:6379> set user:1 {name:wq,age:24}
OK
127.0.0.1:6379> get user:1
"{name:wq,age:24}"

mset、mget批量插入、获取键值

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

getset 先获取,再设置

127.0.0.1:6379> getset k5 v5
(nil)
127.0.0.1:6379> getset k5 v6
"v5"
127.0.0.1:6379> get k5
"v6"

List数据类型指令

在redis中,List可以作为栈、队列、阻塞队列使用
前后赋值、移除元素、通过下标获取值、获取list长度、移除指定的元素、通过下标截取list、根据下标修改值、移动值到另一个list、前后插入值

给list赋值

127.0.0.1:6379> lpush list1  1 2 3 4 5 左插
(integer) 5
127.0.0.1:6379> lrange list1 0 -1  # 先进后出 类似栈结构
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpush list1 6 7		#右插
(integer) 7
127.0.0.1:6379> lrange list1 0 -1			#注意6 7元素的位置分布
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
6) "6"
7) "7"											

移除元素

127.0.0.1:6379> lpop list1
"5"
127.0.0.1:6379> lpop list1		#左删
"4"
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "1"
4) "6"
5) "7"
127.0.0.1:6379> rpop list1		#右删
"7"
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "1"
4) "6"

通过下标获取值

127.0.0.1:6379> lindex list1 1
"2"

移除list中指定数量的value

127.0.0.1:6379> lrange list1 0 -1
1) "123"
2) "3"
3) "2"
4) "6"
127.0.0.1:6379> lrem list1 1 123
(integer) 1
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "6"

通过下标截取list(实质上修改了list)

127.0.0.1:6379> ltrim list1 0 1
OK
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"

根据下标修改值:lset

127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
127.0.0.1:6379> lset list1 0 5
OK
127.0.0.1:6379> lrange list1 0 -1
1) "5"
2) "2"

在指定元素前后插入值:linsert

127.0.0.1:6379> linsert list1 after 2 123  #这里就是在指定元素2后面插入123
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "5"
2) "2"
3) "123"

Set类型基本指令

set集合类型不能有重复值

插入值及查询值:sadd、smembers

127.0.0.1:6379> sadd set hello
(integer) 1
127.0.0.1:6379> sadd set caozuogong
(integer) 1
127.0.0.1:6379> sadd set lya
(integer) 1
127.0.0.1:6379> smembers set
1) "hello"
2) "caozuogong"
3) "lya"

查看集合中有多少个元素:scard

127.0.0.1:6379> scard set
(integer) 3

移除指定元素:srem

127.0.0.1:6379> scard set
(integer) 3
127.0.0.1:6379> srem set lya
(integer) 1
127.0.0.1:6379> smembers set
1) "hello"
2) "caozuogong"
127.0.0.1:6379>

随机抽取元素:srandmember,后面可以指定个数

127.0.0.1:6379> srandmember set
"caozuogong"
127.0.0.1:6379> srandmember set
"hello"

随机移除元素:spop,后面可以指定个数

"hello"
127.0.0.1:6379> spop set
"caozuogong"
127.0.0.1:6379> smembers set
1) "hello"

Hash数据类型操作

hash值的存取:hset、hget,其中myhash为key,field为map

127.0.0.1:6379> hset myhash name lya
(integer) 1
127.0.0.1:6379> hget myhash name
"lya"

一次存取多个值:hmset、hmget

127.0.0.1:6379> hmset myhash1 field v1 field1 v2 field2 v3
OK
127.0.0.1:6379> hmget myhash1
127.0.0.1:6379> hmget myhash1 field field1 field2
1) "v1"
2) "v2"
3) "v3"

一次获取所有值:hgetall,以key-value方式呈现

127.0.0.1:6379> hgetall myhash1
1) "field"
2) "v1"
3) "field1"
4) "v2"
5) "field2"
6) "v3"

删除指定field:hdel

127.0.0.1:6379> hdel myhash1 field
(integer) 1
127.0.0.1:6379> hgetall myhash1
1) "field1"
2) "v2"
3) "field2"
4) "v3"

查看集合中有多少个值:hlen

127.0.0.1:6379> hlen myhash1
(integer) 2

判断指定字段存不存在:hexists

127.0.0.1:6379> hgetall myhash1
1) "field1"
2) "v2"
3) "field2"
4) "v3"
127.0.0.1:6379> hexists myhash1 field1
(integer) 1
127.0.0.1:6379> hexists myhash1 field
(integer) 0

只获取key或value:hkeys、hvals

127.0.0.1:6379> hkeys myhash1
1) "field1"
2) "field2"
127.0.0.1:6379> hvals myhash1
1) "v2"
2) "v3"

自增自减

127.0.0.1:6379> hset myhash1 field 3
(integer) 1
127.0.0.1:6379> hincrby myhash1 field 10
(integer) 13
127.0.0.1:6379> hget myhash1 field
"13"

如果不存在就设置:hsetnx

127.0.0.1:6379> hsetnx myhash1 field 3
(integer) 0

Zset(有序集合)

在set的基础上,增加了一个值,
存取值:zadd、zrange

127.0.0.1:6379> zadd zset 1 one
(integer) 1
127.0.0.1:6379> zadd zset 2 two
(integer) 1
127.0.0.1:6379> zadd zset 3 three
(integer) 1
127.0.0.1:6379> zrange zset 0 -1
1) "one"
2) "two"
3) "three"

查询元素

127.0.0.1:6379> zrangebyscore salary -inf +inf # 普通查询
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores # 带值查询
1) "lisi"
2) "2000"
3) "zhangsan"
4) "2500"
5) "wangwu"
6) "3000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores #查询小于等于2500的
1) "lisi"
2) "2000"
3) "zhangsan"
4) "2500"

移除集合中指定元素:zrem

127.0.0.1:6379> zrem salary lisi
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "zhangsan"
2) "2500"
3) "wangwu"
4) "3000"

从大到小获取元素:zrevrange

127.0.0.1:6379> zrevrange salary 0 -1 withscores
1) "wangwu"
2) "3000"
3) "zhangsan"
4) "2500"

获取集合中的个数:zcard

127.0.0.1:6379> zcard salary
(integer) 2

按区间计算个数:zcount

127.0.0.1:6379> zcount salary 2500 3000
(integer) 2

Jedis测试

1.Jedis测试所需要的jar包

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

2.创建测试程序

package com.xu.jedis;

import redis.clients.jedis.Jedis;

public class JedisDemo1 {
    public static void main(String[] args) {
        //创建jedis对象 构造器总传入ip地址和端口号
        Jedis jedis = new Jedis("127.0.0.1",6379);
        //连接redis的密码
        jedis.auth("123456");
        //测试
        String value = jedis.ping();
        System.out.println(value);
    }
}

3.测试相关数据类型
Jedis-API:Key

jedis.set("k1", "v1");
jedis.set("k2", "v2");
jedis.set("k3", "v3");

Set<String> keys = jedis.keys("*");
System.out.println(keys.size());

for (String key : keys) {
	System.out.println(key);
}

System.out.println(jedis.exists("k1"));
System.out.println(jedis.ttl("k1"));                
System.out.println(jedis.get("k1"));

Jedis-API:String

jedis.mset("str1","v1","str2","v2","str3","v3");
System.out.println(jedis.mget("str1","str2","str3"));

Jedis-API:List

List<String> list = jedis.lrange("mylist",0,-1);
for (String element : list) {
   System.out.println(element);
}

Jedis-API:set

jedis.sadd("orders", "order01");
jedis.sadd("orders", "order02");
jedis.sadd("orders", "order03");
jedis.sadd("orders", "order04");

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

for (String order : smembers) {
   System.out.println(order);
}

jedis.srem("orders", "order02");

Jedis-API:hash

jedis.hset("hash1","userName","lisi");
System.out.println(jedis.hget("hash1","userName"));

Map<String,String> map = new HashMap<String,String>();
map.put("telphone","13810169999");
map.put("address","atguigu");
map.put("email","abc@163.com");

jedis.hmset("hash2",map);

List<String> result = jedis.hmget("hash2", "telphone","email");

for (String element : result) {
   System.out.println(element);
}

Jedis-API:zset

jedis.zadd("zset01", 100d, "z3");
jedis.zadd("zset01", 90d, "l4");
jedis.zadd("zset01", 80d, "w5");
jedis.zadd("zset01", 70d, "z6");
 
Set<String> zrange = jedis.zrange("zset01", 0, -1);

for (String e : zrange) {
	System.out.println(e);
}

实战项目 Jedis实例:手机验证码功能

要求:
1、输入手机号,点击发送后随机生成6位数字码,2分钟有效
2、输入验证码,点击验证,返回成功或失败
3、每个手机号每天只能输入3次

代码展示

package com.xu.jedis;

import redis.clients.jedis.Jedis;

import java.util.Random;

public class PhoneCode {
    public static void main(String[] args) {
        //模拟验证码发送
        //verifyCode("137000000");
        
        //校验发送的验证码
        //getRedisCode("137000000","验证码");
    }

    //1.随即生成一个六位数的验证码
    public static String getCode(){
        Random random = new Random();
        String code = "";
        for (int i = 0; i < 6; i++) {
        // nextInt用法:产生[0,10)范围内的随机数
            int rand = random.nextInt(10); 
            code += rand;
        }
        return code;
    }

    //2.每个手机每天只能发送三次,验证码放到redis中,设置过期时间
    public static void verifyCode(String phone){
        //连接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //输入redis连接密码
        jedis.auth("123456");

        //拼接key
        //手机发送次数key
        String countKey = "VerifyCode" + phone + ":count";
        //验证码key
        String codeKey = "VerifyCode" + phone + ":code";

        //每个手机每天只能发送3次
        String count = jedis.get(countKey);
        if (count == null){
            //没有发送次数,第一次发送
            //设置发送次数是1
            jedis.setex(countKey,24 * 60 * 60,"1");
        }else if (Integer.parseInt(count) <= 2){
            //发送次数+1
            jedis.incr(countKey);
        }else if (Integer.parseInt(count) > 2){
            //发送三次了,不能再发送了
            System.out.println("今天的发送次数已经超过3次了");
            //关闭连接
            jedis.close();
        }

        //发送的验证码要放到redis中,设置过期时间为120s
        String vcode = getCode();
        jedis.setex(codeKey,120,vcode);
        jedis.close();
    }

    //3.验证码校验
    public static void getRedisCode(String phone,String code){
        //从redis中获取验证码
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.auth("123456");

        //验证码key
        String codeKey = "VerifyCode" + phone + ":code";
        String redisCode = jedis.get(codeKey);

        //判断
        if (redisCode.equals(code)){
            System.out.println("成功");
        }else {
            System.out.println("失败");
        }
        jedis.close();
    }
}

springboot整合redis

  1. 在pom.xml文件中引入redis相关依赖
<!-- redis -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!-- spring2.X集成redis所需common-pool2-->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-pool2</artifactId>
	<version>2.6.0</version>
</dependency>
  1. application.properties配置redis配置
    redis有密码时还要配置一个redis.auth
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis数据库索引(默认为0)
spring.redis.database= 0
#连接超时时间(毫秒)
spring.redis.timeout=1800000
#连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=20
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=5
#连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
  1. 添加Redis配置类
    一般都是固定不变的,通用配置添加即可
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
		//key序列化方式
        template.setKeySerializer(redisSerializer);
		//value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
		//value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
		//解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
		// 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}
  1. 测试一下:RedisTestController中添加测试方法
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping
    public String testRedis() {
        //设置值到redis
        redisTemplate.opsForValue().set("name","lucy");
        //从redis获取值
        String name = (String)redisTemplate.opsForValue().get("name");
        return name;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值