1.Redis简介
(1)什么是Redis
①Redis是一个基于内存的key-value结构数据库
②基于内存存储,读写性能高
③适合存储热点数据(热点商品、资讯、新闻)
④Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件
⑤它存储的value类型比较丰富,也被称为结构化的NoSql数据库。NoSql,不仅仅是SQL,泛指非关系型数据库。NoSql数据库
并不是要取代关系型数据库,而是关系型数据库的补充。
(2)Redis应用场景
①缓存
②任务队列
③消息队列
④分布式锁
2.Redis常用命令
(1)Redis中字符串常用命令
①SET key value //设置指定key的值
②GET key // 获取指定key的值
③SETEX key seconds value // 设置指定key的值,并将key的过期时间设为 seconds 秒
④SETNX key value // 只有在key不存在时设置 key 的值
(2)哈希 hash 操作命令
Redis hash是一个String类型的filed和value的映射表,hash特别适合用于存储对象,常用命令
①HSET key filed value // 将哈希表key中的字段field的值设为value
②HGET key field // 获取哈希表中指定字段的值
③HDEL key field // 删除存储在哈希表中的指定字段
④HKEYS key // 获取哈希表中所有字段
⑤HVALS key // 获取哈希表中所有值
⑥HGETALL key // 获取在哈希表中指定key的所有字段和值
(3)列表list操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
①LPUSH key value1 value2 … // 将一个或多个值插入到列表头部
例如:lpush mylist a b c
②LRANGE key start stop // 获取列表指定范围内的元素
例如:lrange mylist 0 -1 // 0 -1表示获取所有
③RPOP key // 移除并获取列表最后一个元素
④LLEN key // 获取列表长度
⑤BRPOP key1 key2 … timeout // 移出并获取列表的最后一个元素,或发现可弹出元素为止
//timeout 超时时间;列表没有元素,就会一直阻塞直到超时
(4)集合set操作命令
Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
①SADD key member1 member2 … // 向集合中添加一个或多个成员
②SMEMBERS key // 返回集合中的所有成员
③SCARD key // 获取集合的成员数
④SINTER key1 key2 … // 返回给定所有集合的交集
⑤SUNION key1 key2 … // 返回所有给定集合的并集
⑥SDIFF key1 key2 … // 返回给定所有集合的差集(key1 - key2)
⑦SREM key member1 member2 … // 移除集合中一个或多个成员
(5)有序集合 sorted set 操作命令
Redis sorted set 有序集合是string类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score)。
redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。常用命令:
①ZADD key score1 member1 score2 member2 … // 向有序集合中添加一个或多个成员,或者更新已存在成员的分数
②ZRANGE key start stop [WITHSCORS] // 通过索引区间返回有序集合中指定区间内的成员(withscors可以带分数一起返回)
③ZINCRBY key increment member // 有序集合中对指定成员的分数加上增量 increment
④ ZREM key member [member …] // 移除有序集合中的一个或多个成员
(6)通用命令
①KEYS pattern // 查找所有符合给定模式(pattern的)key
例如: keys *
②EXISTS key // 检查给定 key 是否存在
③TYPE key // 返回key所存储的值的类型
例如:type myset
④TTL key // 返回给定 key 的剩余生存时间,以秒为单位
例如:ttl name
⑤DEL key // 该命令用于在key存在时删除key
3.在Java中操作Redis
3.1 使用Jedis操作Redis
(1)导入相关坐标
<!-- Jedis坐标 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.1</version></dependency>
(2)相关实例
public class JedisTest {@Testpublic void testJedis() {
// 1.获取连接Jedis jedis = new Jedis("localhost", 6379);
// 2.执行具体的操作jedis.set("username","lisi");String value = jedis.get("username");System.out.println(value);
// 3.关闭连接jedis.close();} }
3.2 在Spring Boot项目使用Spring Data Redis操作Redis
Spring Data Redis 中提供了一个高度封装的类:RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作
封装为opperation接口,具体分类如下:
①ValueOperations:简单K-V操作
②SetOperations:set类型数据操作
③ZSetOperations:zset类型数据操作
④HashOperations:针对map类型的数据操作
⑤ListOperations:针对list类型的数据操作
(1)导入相关坐标
<!-- Spring Data Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
(2)Redis相关配置
spring:
# Redis相关配置redis:host: localhostport: 6379database: 0 # 默认有16个数据库,操作的是第0号数据库jedis:
# Redis连接池配置pool:max-active: 8 # 最大连接数max-wait: 1ms # 连接池最大阻塞等待时间max-idle: 14 # 连接池中的最大空闲连接min-idle: 0 # 连接池中的最小空闲连接
(3)Redis配置类
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
// 创建RedisTemplate对象RedisTemplate<Object, Object> template = new RedisTemplate<>();
// 设置连接工厂template.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());
// 设置value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);
// 返回return template;} }
(3)实例
@SuppressWarnings("all")
@SpringBootTest(classes = SsmMangerApplication.class)
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;//操作String类型数据@Testpublic void testString() {redisTemplate.opsForValue().set("city", "beijing");Object city = redisTemplate.opsForValue().get("city");System.out.println(city);}// 操作Hash类型数据@Testpublic void testHash() {HashOperations hashOperations = redisTemplate.opsForHash();
// 存值hashOperations.put("002", "name", "xaioming");hashOperations.put("002", "age", "20");hashOperations.put("002", "address", "bj");
// 取值String age = (String) hashOperations.get("002", "age");System.out.println(age);
// 获得hash结构中的所有字段Set keys = hashOperations.keys("002");for (Object key : keys) {System.out.println(key);
// 获得hash结构中的所有值List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);} } }//操作List类型的数据@Testpublic void testList() {ListOperations listOperations = redisTemplate.opsForList();
// 存值listOperations.leftPush("mylist", "a");listOperations.leftPushAll("mylist", "b", "c", "d");
// 取值List<String> mylist = listOperations.range("mylist", 0, -1);for (String value : mylist) {System.out.println(value);}
// 出队列Object element = listOperations.rightPop("mylist");System.out.println(element);}// 操作set类型的数据@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();
// 存值setOperations.add("myset", "a", "b", "c", "a");
// 取值Set<String> myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}
// 删除成员setOperations.remove("myset", "a", "b");
// 取值myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}}// 操作ZSet类型的数据@Testpublic void testZSet() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();
// 存值zSetOperations.add("myZset", "a", 10.0);zSetOperations.add("myZset", "b", 11.0);zSetOperations.add("myZset", "c", 12.0);zSetOperations.add("myZset", "a", 13.0);// 取值Set<String> myZSet = zSetOperations.range("myZset", 0, -1);for (String s : myZSet) {System.out.print(s);//bca}// 修改分数zSetOperations.incrementScore("myZset", "b", 20.0);// 取值myZSet = zSetOperations.range("myZset", 0, -1);System.out.println();for (String s : myZSet) {System.out.print(s);//cab}
// 删除成员zSetOperations.remove("myZset", "a", "b");
// 取值myZSet = zSetOperations.range("myZset", 0, -1);System.out.println();for (String s : myZSet) {System.out.print(s);//c}}// 通用操作@Testpublic void testCommon(){
// 获取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.print(key);}
// 判断某个key是否存在Boolean haha = redisTemplate.hasKey("haha");System.out.println(haha);// 删除指定keyredisTemplate.delete("myZset");// 获取指定key对应的value的数据类型DataType dataType = redisTemplate.type("myset");System.out.println(dataType.name());} }