Redis简介
Redis是一个基于内存的 key-value 结构数据库(内存存储)(键值对)
Mysql是将数据,是通过数据文件的方式存放在磁盘上(磁盘存储)(二维表)
Redis特点
抢购秒杀,或者新闻热点,大量的用户去访问的数据,就适合存放在Redis中,是对mysql的补充,往往项目中是和mysql共存的状态
redis进行cmd命令记得tab进行自动扩展……server ……conf启动然后再打开窗口……cli直接连接服务端 keys *检测是否正常查询
exit结束连接 特殊情况客户端连接服务器: ……cli -h localhost -p 6379
这里-h -p可以指定连接哪个端口的redis服务 默认redis不设置密码
编辑redis.windows.conf搜索pass把requirespass前面的#去掉,不作为注释foobared修改为密码
客户端连接服务端 -a 123456带密码连接服务端
在使用图形化界面时记得连接服务端
5种常用数据类型介绍
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
字符串 string
哈希 hash
列表 list 类似java的LinkedList 按照插入顺序排序
集合 set 无序集合
有序集合 sorted set/zset 各种排行榜,有序,升序无重复
Redis常用命令
字符串操作命令
哈希操作命令
列表操作命令
集合操作命令
有序集合操作命令
通用命令
字符串操作命令
Redis 字符串类型常用命令:
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
SETNX key value 只有在 key不存在时设置 key 的值
这里set可以作为插入来使用,插入数据
关于Hash哈希操作
-整个value就是哈希表
-key就是key而field对应哈希的key,value对应哈希的value
哈希操作命令
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令
HSET key field value 将哈希表 key 中的字段 field 的值设为 value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段 (这里个人理解为删除全部)
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值
列表操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令
LPUSH key value1 [value2] 将一个或多个值插入到列表头部 lpush mylist a b c这是头插法
LRANGE key start stop 获取列表指定范围内的元素 索引下标0 或-1
RPOP key 移除并获取列表最后一个元素 队尾元素
LLEN key 获取列表长度
集合操作命令
Redis set 是string类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据,常用命令:
SADD key member1[member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SREM key member1 [member2] 删除集合中一个或多个成员
有序集合操作命令
Redis有序集合是string类型元素的集合,且不允许重复成员。 这里的key可以理解为表名
每个元素都会关联一个double类型的分数。常用命令,
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员 返回集合 [分数]
ZINCRBY key increment member 有序集合中对指定成member 的分数加上增量 increment
ZREM key member [member ...] 移除有序集合中的一个或多个成员
有序集合是根据score根据分数排序
通用命令
Redis的通用命令是不分数据类型的,都可以使用的命令
KEYS pattern 查找所有符合给定模式( pattern)的 key 比如说就是查找redis数据库中所有的key 这里模式很灵活跟搜索框一样,比如set set开头的key
EXISTS key 检查给定 key 是否存在
TYPE key 返回 key 所储存的值的类型
DEL key1 [key2] 该命令用于在 key 存在是删除 key 这里也可以一次性删除多个key
在java中操作Redis
Redis 的 Java 客户端很多,常用的几种
Jedis
Lettuce
Spring Data Redis 对以上两种的封装
Spring Data Redis使用方式
操作步骤:
-导入Spring Data Redis 的maven坐标
-配置Redis数据源
-编写配置类,创建RedisTemplate对象
-通过RedisTemplate对象操作Redis
第一步导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第二步配置数据源
首先是yml的redis配置是写在spring下
redis:
host: localhost
port: 6379
password: 123456
database: 0 // 这里会指定redis的具体数据库是哪个,不配置,默认为0号数据库
因为不建议数据源直接放在yml配置项中,所以还是放在-dev.yml
个人理解dev.yml用法,取名sky:然后下面分级 继而在yml中进行引用dev.yml第三步编写配置类,创建RedisTemplate对象
在Config包下创建类RedisConfig配置类创建方法redisTemplate 传进redis连接工厂参数,返回值为RedisTemplate
记得配置类都要有注解Configuration
序列化器的作用,个人理解,为了图形化界面,也就是ide更直观的展示key不至于错乱, 就需要写序列化器
@Configuration
@Slf4j
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板对象……",);
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
第四步通过RedisTemplate对象操作Redis
个人发现这里调用插入方法都没有返回值,比如查询比如get才可以
在调用redis字符串对象的方法set时,四个参数是设置有效期方法
redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES); // 3而后是单位,分钟
redisTemplate.opsForValue().setIfAbsent("lock","2"); // 如果存在则设置失败,
想要在客户端不乱码,在配置RedisTemplate时,给Value也加个String类型的序列化操作就好了
Redis的Java端基本操作代码
取容器中的redisTemplate
@SpringBootTest
public class SpringDataRedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedisTemplate(){
System.out.println(redisTemplate);
ValueOperations valueOperations =redisTemplate.opsForValue();//操作字符串类型的对象
HashOperations hashOperations = redisTemplate.opsForHash();
ListOperations listOperations = redisTemplate.opsForList();
SetOperations setOperations = redisTemplate.opsForSet();
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
}
//操作字符串类型
@Test
public void testString(){
//set 向redis当中插入
redisTemplate.opsForValue().set("city","北京");
String city = (String) redisTemplate.opsForValue().get("city");
System.out.println("city");
redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);
redisTemplate.opsForValue().setIfAbsent("lock","1");
redisTemplate.opsForValue().setIfAbsent("lock","2"); //如果存在key就不会被执行
}
//操作哈希类型
@Test
public void testHash(){
//hset hget hkeys hvals
//hset
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("100","name","tom");
hashOperations.put("100","age","20");
//hget
String name = (String)hashOperations.get("100","name");//获取name字段对应的val
System.out.println(name);
//hkeys
//这是通过指定表名100查询所有的key字段,应该是没val的
Set keys = hashOperations.keys("100");
System.out.println(keys);
//hvals
List values = hashOperations.values("100");
System.out.println(values);
//hdel
hashOperations.delete("100","age");
}
@Test
public void testList(){
//lpush lrange rpop llen
//lpush
ListOperations listOperations = redisTemplate.opsForList();
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 size = listOperations.size("mylist");
System.out.println(size);
}
//操作集合类数据
public void testSet(){
//sadd smembers scard sinter suntion srem
SetOperations setOperations = redisTemplate.opsForSet();
//sadd
setOperations.add("set1","a","b","c","d");
setOperations.add("set2","a","b","x","y");
//smembers
Set members = setOperations.members("set1");
System.out.println(members);
//scord
Long size = setOperations.size("set1");
System.out.println(size);
//sinter 返回集合交集
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
//suntion 返回集合丙级
Set union = setOperations.union("set1", "set2");
System.out.println(union);
//srem
Long set1 = setOperations.remove("set1","a","b");
}
//操作有序集合类型
public void testZset(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//zadd zrange zincrby zrem
zSetOperations.add("zset1","a",10);
zSetOperations.add("zset1","b",11);
zSetOperations.add("zet1","c",9);
Set zset1 = zSetOperations.range("zset1", 0, -1);
System.out.println(zset1);
//zincrby 为某个集合的元素加上多少分score
zSetOperations.incrementScore("zset1","c",10);
//zrem
zSetOperations.remove("zset1","a","b");
}
@Test
public void testCommon(){
//这里就不像上面似的还要opsFor类型了
//因为是通用命令,所以不用指定类型
//keys exits type del
Set keys = redisTemplate.keys("*");
System.out.println(keys);
//exits检查某个key是否存在
Boolean name = redisTemplate.hasKey("name");
Boolean set1 = redisTemplate.hasKey("set1");
//type查询一下某个key所对应的value什么类型的
//这里key循环遍历所有的keys键
for (Object key : keys){
DataType type = redisTemplate.type(key);
System.out.println(type.name());
//这里返回具体他们都是什么类型的
}
//del 删除指定的key
redisTemplate.delete("mylist");
}
}
标签:常用,redis,数据类型,Redis,println,key,集合,redisTemplate
From: https://www.cnblogs.com/launch/p/18032859