1.命令行操作redis
常用的类型String list hash set zset。
string命令:set key value 。get key。incr key decr key +1 -1
hash hset hget
list可以当做队列,栈使用。 lpush lpop rpush rpop push是从左往右push。llen看长度 lindex 0 查看索引为0的值。 lrange 0 2 查看索引从0-2的值
set sadd key 1 2 3 4 scard key 查看元素数量 spop key 随机弹出一个值(可以实现抽奖) smembers key查看全部元素
zset有序集合 zadd key 10 aa 20 bb 30 cc 要在值边上加个分数。 zcard key 统计值的数量。 zscore key value获取该值的分数。 zrank key value 获取该值的排名 。zrange key 0 2 取位于0-2排名的三个值,升序的。
全局命令:keys查出所有key。 keys test 查看test开头的key
type key 查看key的类型。 exists key查看该值是否存在。 del key删除key。expire key 10 当前key10秒后过期
2.springboot操作redis
@RunWith(SpringRunner.class)
@SpringBootTest
//这个注解,测试时,就能和开发的主启动类(配置类)用于一样的配置
@ContextConfiguration(classes = CommunityApplication.class)
public class RedisTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testString(){
String key = "test:count";
redisTemplate.opsForValue().set(key,1);
System.out.println(redisTemplate.opsForValue().get(key));
System.out.println(redisTemplate.opsForValue().increment(key,10));
}
@Test
public void testHash(){
String key = "test:user";
redisTemplate.opsForHash().put(key,"id",1);
redisTemplate.opsForHash().put(key,"name","niaho");
System.out.println(redisTemplate.opsForHash().get(key,"id"));
System.out.println(redisTemplate.opsForHash().get(key,"name"));
}
@Test
public void testList(){
String key = "test:ids";
redisTemplate.opsForList().leftPush(key,1);
redisTemplate.opsForList().leftPush(key,2);
System.out.println(redisTemplate.opsForList().size(key));
System.out.println(redisTemplate.opsForList().index(key,0));
System.out.println(redisTemplate.opsForList().range(key,0,2));
redisTemplate.opsForList().leftPop(key);
System.out.println(redisTemplate.opsForList().range(key,0,2));
}
@Test
public void testSets() {
String redisKey = "test:teachers";
redisTemplate.opsForSet().add(redisKey, "刘备", "关羽", "张飞", "赵云", "诸葛亮");
System.out.println(redisTemplate.opsForSet().size(redisKey));
System.out.println(redisTemplate.opsForSet().pop(redisKey));
System.out.println(redisTemplate.opsForSet().members(redisKey));
}
@Test
public void testSortedSets() {
String redisKey = "test:students";
redisTemplate.opsForZSet().add(redisKey, "唐僧", 80);
redisTemplate.opsForZSet().add(redisKey, "悟空", 90);
redisTemplate.opsForZSet().add(redisKey, "八戒", 50);
redisTemplate.opsForZSet().add(redisKey, "沙僧", 70);
redisTemplate.opsForZSet().add(redisKey, "白龙马", 60);
System.out.println(redisTemplate.opsForZSet().zCard(redisKey));
System.out.println(redisTemplate.opsForZSet().score(redisKey, "八戒"));
System.out.println(redisTemplate.opsForZSet().reverseRank(redisKey, "八戒"));
System.out.println(redisTemplate.opsForZSet().reverseRange(redisKey, 0, 2));
}
@Test
public void testKeys() {
redisTemplate.delete("test:user");
System.out.println(redisTemplate.hasKey("test:user"));
redisTemplate.expire("test:students", 10, TimeUnit.SECONDS);
}
// 多次使用同一个key,可以将其绑定,下次使用命令不需要再次填写key
@Test
public void testBoundOperations() {
String redisKey = "test:count";
BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
operations.increment();
operations.increment();
operations.increment();
operations.increment();
operations.increment();
System.out.println(operations.get());
}
3.redis的事务
/**
* 编程式事务
* 由于redis的事务没有ACID,不是关系型数据库。所以redis的事务是下面这样的:
* 把命令全部放入一个队列,等commit时,在一起批量执行,所以你想在事务中查询,不会立刻出结果。
* 所以在事务中加入查询没意义。
* 而声明式事务,直接加在一个方法上,方法里面的所以代码都被此事务约束。
* 现在我们需要事务只是作用于方法中的几行代码,所以我们要编程式事务。
*
*/
@Test
public void testTransaction() {
Object result = redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations redisOperations) throws DataAccessException {
String redisKey = "text:tx";
// 启用事务
redisOperations.multi();
redisOperations.opsForSet().add(redisKey, "zhangsan");
redisOperations.opsForSet().add(redisKey, "lisi");
redisOperations.opsForSet().add(redisKey, "wangwu");
System.out.println(redisOperations.opsForSet().members(redisKey));
// 提交事务
return redisOperations.exec();
}
});
System.out.println(result);
}