做网站买完域名还需要什么,果汁网站模板,邢台商城类网站建设,软件技术培训目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis#xff0c;并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所… 目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所有的键获取key对应的所有map键值对获取key对应的map中key为username的map的对应的值获取key对应的map中所有的值判断key对应的map中是否有指定的键如果key对应的map不存在则新增到map中存在则不新增也不覆盖将一个完成的键值对直接放入redis命令读取数据 set向key中批量添加值获取key中的所有值获取key对应集合的长度随机获取key对应的集合中的元素随机获取key对应集合中指定个数的元素随机获取key对应集合中指定个数的元素并且去重将key1对应集合中的值v1转移到key2集合中随机删除集合中的一个元素随机删除集合中的指定数量的元素批量移除key对应集合中指定的元素获取key与另一个otherKey集合之间的差值获取key与另一个otherKey所对应的集合之间的差值并将结果存入指定的destKey中获取两个集合中的交集元素获取两个集合的合集并且去重命令读取数据 zset向指定key中添加元素按照score值由小到大进行排列获取key对应集合中o元素的score值获取集合大小获取指定下标之间的值获取指定score区间的值获取指定元素在集合中的索引索引从0开始获取倒序排列的索引值索引从0开始移除集合中指定的值移除指定下标的值命令读取数据 注意 前言 在springboot框架中通过RedisTemplate中封装好的方法去操作redis中的各种数据类型完成增删改查操作。 本项目将数据序列化为json格式分别以set、zset、hash的结构存入数据库中完成查询所有数据、通过id查询单个数据新增数据的操作。
redis有五种常用的数据结构string hash list set zset
key-string一个key对应一个值。
key-hash一个key对应一个Map。
key-list一个key对应一个列表。
key-set一个key对应一个集合。
key-zset一个key对应一个有序的集合。Windows系统打开redis
我从网上下载来的redis包里面有这些内容。 但是启动redis的服务端时不会去直接双击“redis-server.exe”文件因为这样启动不会去读取配置文件需要通过命令行启动。如果需要远程访问redis则需要在配置文件中配置ip等信息。
bind 0.0.0.0
监听地址默认是127.0.0.1会导致只能在本地访问修改为0.0.0.0则可以在任意IP访问生产环境不要设置为0.0.0.0protected-mode no
将保护模式改为no使用cmd命令行启动服务端
redis-server redis.conf双击启动客户端 redis的存储查询数据命令会在演示springboot使用redis中说明。
Springboot整合redis
依赖 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.0.RELEASE/version/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependencydependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-redis/artifactId/dependencydependencygroupIdredis.clients/groupIdartifactIdjedis/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.70/version/dependency/dependencies实体类
public class User {private Integer id 0;private String username ;private String remark ;
}yml配置文件
用于配置redis的ip、端口、数据库、连接池等
spring:redis:port: 6379host: 127.0.0.1database: 1password: 123456jedis:pool:max-active: 8max-idle: 8max-wait: 1mstimeout: 5000msconfig配置
将实体类数据序列化为json格式
import java.text.SimpleDateFormat;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import com.fasterxml.jackson.databind.ObjectMapper;Configuration
public class RedisConfig {Beanpublic RedisTemplateObject, Object redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplateObject, Object template new RedisTemplate();//ObjectMapper 指定在转成json的时候的一些转换规则ObjectMapper objectMapper new ObjectMapper();objectMapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss));template.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer new Jackson2JsonRedisSerializer(Object.class);// 把自定义的objectMapper设置到jackson2JsonRedisSerializerjackson2JsonRedisSerializer.setObjectMapper(objectMapper);// RedisTemplate默认的序列化方式使用的是jdk的序列化// 设置了key的序列化方式template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(jackson2JsonRedisSerializer); // 配置hash格式// 设置了value序列化方式template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer); // 配置hash格式return template;}
}在启动类中需要使用ComponentScan(注解扫描配置文件
各个数据存储类型分别说明记录
专门编写一个测试类
import com.alibaba.fastjson.JSON;
import com.redis.StartApplication;
import com.redis.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.ArrayList;
import java.util.List;SpringBootTest(classes StartApplication.class)
RunWith(SpringJUnit4ClassRunner.class)
public class TestRedis {Autowiredprivate RedisTemplate redisTemplate;
}string
初始化数据 private String initUserJson() {return JSON.toJSON(new User(1,hzx1,This is a test user)).toString();}数据写入redis并查询 Testpublic void saveDataInRedisString() {redisTemplate.opsForValue().set(user, initUserJson());// 输出存入redis的数据System.out.println(redisTemplate.opsForValue().get(user));}通过命令行查询
#1. 添加值
set key value#2. 取值
get keylist
初始化数据 private List initUserList(int num) {ListUser resUserList new ArrayList();for (int i 1; i num; i) {resUserList.add(new User(i, hzx i, This is the i th user));}return resUserList;}插入数据到redis中
list通过链表实现插入数据时需要区分左插入和右插入。可以逐条数据插入也可以批量数据插入 Testpublic void saveDataInRedisList() {List list initUserList(10);// 逐条插入for (Object user : list) {redisTemplate.opsForList().leftPush(userListLeft, user);redisTemplate.opsForList().rightPush(userListRight,user);}// 批量插入redisTemplate.opsForList().leftPushAll(userListLeft,list);redisTemplate.opsForList().rightPushAll(userListRight,list);}从redis中读取 Testpublic void queryDataFromRedisList(){List userList;System.out.println(左插入List);userList redisTemplate.opsForList().range(userListLeft, 0, 10);for (Object o : userList) {System.out.println(o.toString());}System.out.println(右插入List);userList redisTemplate.opsForList().range(userListRight, 0, 10);for (Object o : userList) {System.out.println(o.toString());}}两种插入方式最终顺序也不同
命令读取数据
#1. 存储数据从左侧插入数据从右侧插入数据
lpush key value [value ...]
rpush key value [value ...]#2. 存储数据如果key不存在什么事都不做如果key存在但是不是list结构什么都不做
lpushx key value
rpushx key value#3. 修改数据在存储数据时指定好你的索引位置,覆盖之前索引位置的数据index超出整个列表的长度也会失败
lset key index value#4. 弹栈方式获取数据左侧弹出数据从右侧弹出数据
lpop key
rpop key#5. 获取指定索引范围的数据start从0开始stop输入-1代表最后一个-2代表倒数第二个
lrange key start stop#6. 获取指定索引位置的数据
lindex key index#7. 获取整个列表的长度
llen key#8. 删除列表中的数据他是删除当前列表中的count个value值count 0从左侧向右侧删除count 0从右侧向左侧删除count 0删除列表中全部的value
lrem key count value#9. 保留列表中的数据保留你指定索引范围内的数据超过整个索引范围被移除掉
ltrim key start stop#10. 将一个列表中最后的一个数据插入到另外一个列表的头部位置
rpoplpush list1 list2hash
向redis中逐个添加map键值对
redisTemplate.opsForHash().put(map1,id,1);
redisTemplate.opsForHash().put(map1,username,hzx1);
redisTemplate.opsForHash().put(map1,remark,This is the No.1 user);获取key对应的map中所有的键
redisTemplate.opsForHash().keys(map1)获取key对应的所有map键值对
redisTemplate.opsForHash().entries(map1)获取key对应的map中key为username的map的对应的值
redisTemplate.opsForHash().get(map1, username)获取key对应的map中所有的值
redisTemplate.opsForHash().values(map1)判断key对应的map中是否有指定的键
redisTemplate.opsForHash().hasKey(map1,username)如果key对应的map不存在则新增到map中存在则不新增也不覆盖 redisTemplate.opsForHash().putIfAbsent(map2,username,hzx2);redisTemplate.opsForHash().putIfAbsent(map2,username,hzx02abcd);将一个完成的键值对直接放入redis MapObject,Object map3 new HashMap();
map3.put(id,3);
map3.put(username,hzx03);
redisTemplate.opsForHash().putAll(map3,map3);命令读取数据
#1. 存储数据
hset key field value#2. 获取数据
hget key field#3. 批量操作
hmset key field value [field value ...]
hmget key field [field ...]#4. 自增指定自增的值
hincrby key field increment#5. 设置值如果key-field不存在那么就正常添加如果存在什么事都不做
hsetnx key field value#6. 检查field是否存在
hexists key field #7. 删除key对应的field可以删除多个
hdel key field [field ...]#8. 获取当前hash结构中的全部field和value
hgetall key#9. 获取当前hash结构中的全部field
hkeys key#10. 获取当前hash结构中的全部value
hvals key#11. 获取当前hash结构中field的数量
hlen keyset
向key中批量添加值
redisTemplate.opsForSet().add(set1,hzx1,hzx2);
redisTemplate.opsForSet().add(set1,hzx3);获取key中的所有值
redisTemplate.opsForSet().members(set1)获取key对应集合的长度
redisTemplate.opsForSet().size(set1)随机获取key对应的集合中的元素
redisTemplate.opsForSet().randomMember(set1)随机获取key对应集合中指定个数的元素
set本身是不会有重复的值 随机获取可能获取到一样的所以返回的list集合中可能会有重复的值
redisTemplate.opsForSet().randomMembers(set1,2)随机获取key对应集合中指定个数的元素并且去重
redisTemplate.opsForSet().distinctRandomMembers(set1,2)将key1对应集合中的值v1转移到key2集合中
key2不存在直接新增 v1不存在转移失败返回false
redisTemplate.opsForSet().add(set2,hzx4);
redisTemplate.opsForSet().move(set2,hzx4,set1);随机删除集合中的一个元素
redisTemplate.opsForSet().pop(set1);随机删除集合中的指定数量的元素
// 随件删除两个元素
redisTemplate.opsForSet().pop(set1,2);批量移除key对应集合中指定的元素
redisTemplate.opsForSet().remove(set1,hzx1,hzx2);获取key与另一个otherKey集合之间的差值
difference(K key, K otherKey) key中有otherKeys中没有的
redisTemplate.opsForSet().add(set1,hzx1,hzx2,hzx3);
redisTemplate.opsForSet().add(set2,hzx1,hzx4,hzx5);
redisTemplate.opsForSet().difference(set1,set2)获取key与另一个otherKey所对应的集合之间的差值并将结果存入指定的destKey中
differenceAndStore(K key, K otherKey, K destKey)
redisTemplate.opsForSet().differenceAndStore(set1,set2,set2);获取两个集合中的交集元素
intersect(K key, K otherKey)
redisTemplate.opsForSet().add(set1,hzx1,hzx2);
redisTemplate.opsForSet().add(set2,hzx2,hzx3,hzx4);
System.out.println(redisTemplate.opsForSet().intersect(set1,set2));获取两个集合的合集并且去重
union(K key, K otherKey)
redisTemplate.opsForSet().add(set1,hzx1,hzx2);
redisTemplate.opsForSet().add(set2,hzx2,hzx3,hzx4);
System.out.println(redisTemplate.opsForSet().union(set1,set2));命令读取数据
#1. 存储数据
sadd key member [member ...]#2. 获取数据获取全部数据
smembers key#3. 随机获取一个数据获取的同时移除数据count默认为1代表弹出数据的数量
spop key [count]#4. 交集取多个set集合交集
sinter set1 set2 ...#5. 并集获取全部集合中的数据
sunion set1 set2 ...#6. 差集获取多个集合中不一样的数据
sdiff set1 set2 ...# 7. 删除数据
srem key member [member ...]# 8. 查看当前的set集合中是否包含这个值
sismember key memberzset
向指定key中添加元素按照score值由小到大进行排列
add(K key, V value, double score)
redisTemplate.opsForZSet().add(zSet1,hzx1,1);
redisTemplate.opsForZSet().add(zSet1,hzx2,2);
redisTemplate.opsForZSet().add(zSet1,hzx3,3);
System.out.println(redisTemplate.opsForZSet().range(zSet1,0,3));获取key对应集合中o元素的score值
score(K key, Object o)
System.out.println(redisTemplate.opsForZSet().score(zSet1,hzx2));获取集合大小
zCard(K key)
System.out.println(redisTemplate.opsForZSet().zCard(zSet1));获取指定下标之间的值
range(K key, long start, long end) (0,-1)就是获取全部
System.out.println(redisTemplate.opsForZSet().range(zSet1,0,-1));获取指定score区间的值
rangeByScore(K key, double min, double max)
System.out.println(redisTemplate.opsForZSet().rangeByScore(zSet1,1.0,2.0));获取指定元素在集合中的索引索引从0开始
rank(K key, Object o)
System.out.println(redisTemplate.opsForZSet().rank(zSet1,hzx3));获取倒序排列的索引值索引从0开始
reverseRank(K key, Object o)
System.out.println(redisTemplate.opsForZSet().reverseRank(zSet1,hzx3));移除集合中指定的值
remove(K key, Object… values)
redisTemplate.opsForZSet().remove(zSet1,hzx2);
System.out.println(redisTemplate.opsForZSet().range(zSet1,0,-1));移除指定下标的值
removeRange(K key, long start, long end)
System.out.println(移出前: redisTemplate.opsForZSet().range(zSet1,0,-1));
redisTemplate.opsForZSet().removeRange(zSet1,0,1);
System.out.println(移出后: redisTemplate.opsForZSet().range(zSet1,0,-1));命令读取数据
#1. 添加数据(score必须是数值。member不允许重复的。)
zadd key score member [score member ...]#2. 修改member的分数如果member是存在于key中的正常增加分数如果memeber不存在这个命令就相当于zadd
zincrby key increment member#3. 查看指定的member的分数
zscore key member#4. 获取zset中数据的数量
zcard key#5. 根据score的范围查询member数量
zcount key min max#6. 删除zset中的成员
zrem key member [member...]#7. 根据分数从小到大排序获取指定范围内的数据withscores如果添加这个参数那么会返回member对应的分数
zrange key start stop [withscores]#8. 根据分数从大到小排序获取指定范围内的数据withscores如果添加这个参数那么会返回member对应的分数
zrevrange key start stop [withscores]#9. 根据分数的返回去获取member(withscores代表同时返回score添加limit就和MySQL中一样如果不希望等于min或者max的值被查询出来可以采用 ‘(分数’ 相当于 但是不等于的方式最大值和最小值使用inf和-inf来标识)
zrangebyscore key min max [withscores] [limit offset count]#10. 根据分数的返回去获取member从大到小获取(withscores代表同时返回score添加limit就和MySQL中一样)
zrevrangebyscore key max min [withscores] [limit offset count]
# zrevrangebyscore zset2004 inf 10 limit 0 2 #获取10的元素并从中获取一页数据(0 2)注意 执行添加操作时要注意当sqlserver数据库添加成功而redis添加失败的情况。 在hash、set、zset中zset既要排序又要查重对内存的消耗是最大的所以一般不使用。