一:Redis入门
1.1:Redis简介
Redis是一个基于内存的Key-Value结构数据库。
Redis与SQL不同的是,SQL是以二维表存储数据,Redis以键值对存储数据。
优点:
1:基于内存存储,读写性能高
2:适合存储热点数据(热点商品,资讯,新闻)-->特点:访问量大的数据。
1.2:Redis下载与安装
1.2.1:Windows版的Redis下载与安装
将其下载好的window版的Redis进行下载后,解压缩,会得到下面的目录。
1.3:Redis服务启动与安装
1.3.1在解压后的文件中输入cmd
1.3.2:在cmd中输入命令
redis-server.exe redis.windows.conf
1.3.3:启动成功
1.3.4:连接服务端
重复1 2 两个步骤,重新开启一个cmd命令行,输入
redis-cli.exe
当出现底下这个代码时:则代表连接到服务端
连接到别的Redis服务
1.3.5:停止Redis服务
二:Redis数据类型
2.1:简单介绍5种数据类型
2.2:5种数据类型的特点
*字符串:普通字符串,Redis最简单的数据类型。
*哈希:也叫散列,类似于Java中HashMap结构,常用来存储Java中的对象。
*列表:按照插入顺序排序,可以有重复的元素,类似于Java中的LinkedList。
*集合:无序集合,类似于Java中的HashSet
*有序集合:每个元素会关联一个分数,根据分数升序,无重复元素
三:Redis常用命令
3.1:字符串操作命令
SET key value | 设置指定key的值 |
Get key | 获取指定key的值 |
SETEX key seconds value | 设置指定key的值,并将key的过期时间设为seconds秒(常用在验证码) |
SETNX key value | 只有存在key不存在时,设置key的值 |
代码演示:
OK > get name jack > get abc null > setex code 30 1234 OK > get code 1234 > get code null
3.2:哈希操作命令
HSET key field value | 将哈希表key中的字段fileld的值设为value |
HGTE key field | 获取存储在哈希表种指定字段的值 |
HDEL key field | 删除存储在哈希表种的指定字段 |
HKEYS key | 获取哈希表中的字段 |
HVALS key | 获取哈希表中所有值 |
> Hset 100 name xiaoming 1 > hset 100 age 22 1 > Hget 100 name xiaoming > Hget 100 age 22 > Hdel 100 name 1 > Hset 100 name zhangsan 1 > HKEYS key > HKEYS 100 age name > HVA ERR unknown command 'hva' > HVALS 100 22 zhangsan
3.3:列表操作命令
LPUSH key value1[value2] | 将一个或多个插入到列表头部 |
LRIGHT key start stop | 获取列表指定范围内的元素 |
RPOP key | 移除并获取列表最后一个元素 |
LIEN key | 获取列表长度 |
> lpush mylist a b c 3
0代表从列表的第一个元素开始,-1代表列表的最后一个元素
> lrange mylist 0 -1 d c b a
rpop命令删除列表的最后一个元素。rpop key
> rpop mylist a
> Llen mylist 3
3.4:集合操作命令 (无序,不可重复)
sadd key member1 member2 | 向集合添加一个或多个成员 |
smembers key | 返回集合中的所有成员 |
scard key | 返回集合中的成员数 |
sinter key1 key2 | 返回给定集合中的交集 |
sunion key1 key2 | 返回所有给定集合的并集 |
srem key member1 member2 | 删除集合中一个或多个集合 |
添加集合 set1 set2
> sadd set1 1 2 3 4 5 5 > sadd set2 1 2 3 4 10 5
查询当前集合的成员
> smembers set1 1 2 3 4 5
查询当前集合的成员的个数
> scard set1 5
求交集
> sinter set1 set2 1 2 3 4
求并集
> sunion set1 set2 1 2 3 4 5 10
删除集合中的元素
> srem set1 1 1
3.5:有序集合操作命令 (有序)
zadd key score1 member1 score2 member2 | 向有序集合添加一个或多个成员 |
zrange key start stop【withscores】 | 通过索引返回集合中的成员 |
zincrby key increment member | 分数+increament |
zrem key member | 删除集合中的元素 |
在有序集合中添加元素:按刚开始所赋予的分数进行排序,按照升序进行排序
> zadd zset1 10.0 a 10.5 b 2 > zadd zset1 10.2 c 1
> zrange zset1 0 -1 withscores a 10 c 10.199999999999999 b 10.5
给集合中的某一个元素增加score值
> zincrby zset1 5.0 a 15
删除某一个元素
> zrem zset1 a 1
3.6:通用命令
keys pattern | 查询所有符合给定模式的key |
exists key | 检查给定key是否存在 |
type key | 返回key所储存的值的类型 |
del key | 该命令用于在key存在是删除key |
查看所有的key值
> keys * set1 key1 person zset1 name set2 100 mylist
查看key的类型
> type 100 hash
判断key存不存在
> EXISTS 100 1
删除key值
> del 100 1
四:在Java中操作Redis
4.1:Redis的Java客户端
1:Jedis
2:Lettuce:基于多线程实现的redis
3:Spring Data Redis:将jedis和Lettuce进行高度封装。
4.2:Spring Data Redis使用方式
操作步骤
4.2.1:导入Spring Data Redis 的maven坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.7.3</version> </dependency>
4.2.2:配置Redis数据源:可以配置database(默认是0-15个库)
spring: redis: host: localhost port: 6379
4.2.3:编写配置类,创建RedisTemplate对象
@Configuration @Slf4j public class RedisConfiguration { //返回的是一个RedisTemplate对象,并且添加redis连接的工厂 @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ log.info("开始创建redis模板对象"); RedisTemplate redisTemplate = new RedisTemplate(); //设置redis的连接工厂对象 redisTemplate.setConnectionFactory(redisConnectionFactory); //设置redis的序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; } }
生成测试类:
@SpringBootTest class RedisConfigurationTest { @Autowired private RedisTemplate redisTemplate; @Test void redisTemplate() { System.out.println(redisTemplate); //操作字符串 ValueOperations valueOperations = redisTemplate.opsForValue(); //操作哈希 HashOperations hashOperations = redisTemplate.opsForHash(); //操作链表 ListOperations listOperations = redisTemplate.opsForList(); //操作无序集合 SetOperations setOperations = redisTemplate.opsForSet(); //操作有序集合 ZSetOperations zSetOperations = redisTemplate.opsForZSet(); } }
4:通过RedisTemplate对象操作Redis
4.3:5种类型操作方式
4.3.1:字符串指令在Java中的使用
在测试类中使用:
@Test public void testString(){ //set get setex setnx ValueOperations valueOperations = redisTemplate.opsForValue(); valueOperations.set("city","北京"); String city =(String) valueOperations.get("city"); System.out.println(city); valueOperations.set("code","1234",3, TimeUnit.MINUTES); //setNx valueOperations.setIfAbsent("lock",1); valueOperations.setIfAbsent("lock",1); }
4.3.2:哈希指令在Java中的使用
@Test public void testHash(){ //hset HashOperations hashOperations = redisTemplate.opsForHash(); hashOperations.put("Person","name","张三"); hashOperations.put("Person","age",20); //hget String name = (String)hashOperations.get("Person", "name"); //删除hash中对应的key Set person = hashOperations.keys("Person"); System.out.println(person); List person1 = hashOperations.values("Person"); System.out.println(person1); hashOperations.delete("Person","age"); }
4.3.3:列表指令在Java中的使用
@Test public void testList(){ ListOperations listOperations = redisTemplate.opsForList(); //lput listOperations.leftPushAll("mylist","a","b","c"); listOperations.leftPush("mylist","d"); //lrange List mylist = listOperations.range("mylist", 0, -1); System.out.println(mylist); //rpop listOperations.rightPop("mylist"); //llen Long mylist1 = listOperations.size("mylist"); System.out.println(mylist1); }
4.3.4:无序集合指令在java中的使用
@Test public void testSet(){ SetOperations setOperations = redisTemplate.opsForSet(); //sadd setOperations.add("set1","a","b","c","d"); setOperations.add("set2","a","b","c","y"); //smember 获取集合中的所有成员 Set set1 = setOperations.members("set1"); System.out.println(set1); //ssize 获取集合中成员的个数 Long set11 = setOperations.size("set1"); System.out.println(set11); //求两个集合中的交集 Set intersect = setOperations.intersect("set1", "set2"); System.out.println(intersect); //求两个集合的并集 Set union = setOperations.union("set1", "set2"); System.out.println(union); //删除集合中的元素 setOperations.remove("set1","a"); }
运行结果:
4.3.5:有序集合在Java中的使用
@Test void testZset(){ ZSetOperations zSetOperations = redisTemplate.opsForZSet(); //zadd zSetOperations.add("zset1","a",10.0); zSetOperations.add("zset1","b",10.1); zSetOperations.add("zset1","c",10.2); //zrange zSetOperations.range("zset1",0,-1); //zincrby zSetOperations.incrementScore("zset1","c",10); //zream zSetOperations.remove("zset1","a"); }
4.3.6:通用命令
@Test void testCommon(){ //判断有没有包含某个字符的key值 Set keys = redisTemplate.keys("*"); System.out.println(keys); //hasKey判断有没有key Boolean zset11 = redisTemplate.hasKey("zset1"); System.out.println(zset11); DataType zset1 = redisTemplate.type("zset1"); System.out.println(zset1); redisTemplate.delete("mylist"); }