1、常用命令:
登录客户端``
选择库(16个 index为0-15)select 1
清空当前数据库所有的key flushdb
redis-cli //登录客户端
select 1 //选择库(16个 index为0-15)
flushdb //清空当前数据库所有的key
keys * //查看所有的key
type test:user //查看值的类型
exists test:user //查看是否有key
del test:user //删key
expire test:students 10 //10后删除这个key
字符串strings
set test:count 1
get test:count
incr test:count // 加1
decr test:count // 减1
哈希hash
hset test:user id 1
hset test:user username zhangsan
hget test:user id
列表lists, 进从两边都可以,出从两边也都可以。
lpush test:ids 101 102 103 // 左进 先进101,然后102,最后103;因为左进,103的索引是0,101的索引是2
llen test:ids // 长度
lindex test:ids 2 // 查看index=2的值
lrange test:ids 0 2 // 查看index0-2的值
rpop test:ids // 右出pop
集合sets
sadd test:teachers aaa bbb ccc ddd eee
scard test:teachers // 查看有几个
spop test:teachers // 因为无序,随机pop
smembers test:teachers // 查看有哪些元素
Spring
有序集合sorted sets,有序给权重score,小的排前面,相当于有索引
zadd test:students 10 aaa 20 bbb 30 ccc 40 ddd 50 eee
zcard test:students // 集合里有几个元素
zscore test:students ccc // 查看score
zrank test:students ccc // 查看rank,越小越小,从0开始
zrange test:students 0 2 //rank范围
2、Spring整合Redis
配置Redis数据库参数: application.properties
# RedisProperties,其他有默认值,这三个必须配
spring.redis.database=11
spring.redis.host=localhost
spring.redis.port=6379
编写配置类RedisConfig ,构造RedisTemplate
@Configuration
public class RedisConfig {
@Bean//定义第三方bean,通过redisTemplate访问Redis
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
// 访问数据库,需要注入连接,方法上声明参数,这个参数就被容器装配了
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 存到数据库指定序列化方式,key-value(key序列化方式,value序列化方式,hash自己又有key value)
template.setKeySerializer(RedisSerializer.string());// 设置key的序列化方式
template.setValueSerializer(RedisSerializer.json());// 设置value的序列化方式
template.setHashKeySerializer(RedisSerializer.string());// 设置hash的key的序列化方式
template.setHashValueSerializer(RedisSerializer.json());// 设置hash的value的序列化方式
// 触发生效
template.afterPropertiesSet();
return template;
访问Redis,测试类RedisTests
5中value数据类型:
redisTemplate.opsForValue()
redisTemplate.opsForHash()
redisTemplate.opsForList()
redisTemplate.opsForSet()
redisTemplate.opsForZSet()
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class RedisTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testStrings() {
String redisKey = "test:count";
redisTemplate.opsForValue().set(redisKey, 1);
System.out.println(redisTemplate.opsForValue().get(redisKey));
System.out.println(redisTemplate.opsForValue().increment(redisKey));
System.out.println(redisTemplate.opsForValue().decrement(redisKey));
}
@Test
public void testHashes() {
String redisKey = "test:user";
redisTemplate.opsForHash().put(redisKey, "id", 1);
redisTemplate.opsForHash().put(redisKey, "username", "zhangsan");
System.out.println(redisTemplate.opsForHash().get(redisKey, "id"));
System.out.println(redisTemplate.opsForHash().get(redisKey, "username"));
}
@Test
public void testLists() {
String redisKey = "test:ids";
redisTemplate.opsForList().leftPush(redisKey, 101);
redisTemplate.opsForList().leftPush(redisKey, 102);
redisTemplate.opsForList().leftPush(redisKey, 103);
System.out.println(redisTemplate.opsForList().size(redisKey));
System.out.println(redisTemplate.opsForList().index(redisKey, 0));
System.out.println(redisTemplate.opsForList().range(redisKey, 0, 2));
System.out.println(redisTemplate.opsForList().leftPop(redisKey));
System.out.println(redisTemplate.opsForList().leftPop(redisKey));
System.out.println(redisTemplate.opsForList().leftPop(redisKey));
}
@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));
}
测试keys
redisTemplate.delete
redisTemplate.hasKey
redisTemplate.expire
@Test
public void testKeys() {
redisTemplate.delete("test:user");
System.out.println(redisTemplate.hasKey("test:user"));
redisTemplate.expire("test:students", 10, TimeUnit.SECONDS);
}
绑定redisKey,不用每次都写:
// 批量发送命令,节约网络开销.
@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());
}
编程式事务:
关系型数据库是ACID的,Redis不是的,Redis把命令存到队列中,在事务提交之后才会传给服务器,服务器再统一批量查询。所以在事务未提交时,不会立刻返回结果。
Spring支持编程式事务和声明式事务。声明式事务简单,可以通过配置和注解的方式实现,但是只能精确到方法,以整个方法为单位作为事务。而想要多一个方法里面的某几句命令不能实现,所以声明式事务并不常用,通常使用编程式事务 。手动写,启用事务和提交事务。
// 编程式事务
@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);
}
第一行先返回的空,是因为在事务中查询,没有返回值。
第二行提交事务之后,有返回值,先返回每句话修改的行数,再返回新增的value。