文章目录
环境连接
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的有效时长,expire、ttl等
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
- 在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>
- 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
- 添加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;
}
}
- 测试一下: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;
}
}