Redis介绍
Redis(Remote Dictionary Server)远程字典服务,是一个开源的使用 ANSI C语言编写、支持网络、可基于内存亦可持久性的日志型、key-value 数据库,并提供多种语言的 API,是当下最流行的NoSQL技术之一。
Redis八种数据类型
2.1. String类型
- 设值与取值
- 自增自减
- 范围取值
- 字符替换
- setex和setnx
- 同时取和设值多个值
对象值的设置与获取
- getset方法,先get后set,不存在则返回nil
2.2. List数据类型
- list常用作栈或者队列,指令以l开头表示左侧队列执行,r表示右侧队列执行。
- 弹出操作pop
3. list索引取值与长度
4. 移除指定的值
5. ltrim截断
6. rpoplpush: 移除list的最后一个元素,并将它移动到新列表中
7. lset: 修改指定下标的值
8. linsert: 在列表中的某个值前面或者后面插入值
2.3. set数据类型
- 元素的增删与获取
- 差集、交集、并集
2.4. hash数据类型
hash数据类型也是key-value形式,只不过value为map形式。
- 常用的增删取值操作
- 属性值的增加与减少
- hsetnx: 不存在则设置
2.5. zset数据类型
zset为有序set数据类型。
2.6. geospatial数据类型
geo数据类型用来计算地理位置信息,有效的位置范围为经度从 -180 度到 180 度,纬度从 -85.05112878 度到 85.05112878 度,其底层使用zset实现,zset的操作对geo类型也适用。
添加如下模拟数据:
获取两个位置间的距离,默认以米作为单位,还可以指定千米(km)、英里(mi)、英尺(ft)。
georadius 以给定的经纬度为中心,找出某一半径内的元素
2.7. hyperloglog数据类型
hyperloglog常用来统计网站的每日访问量,即UV,UV是指通过互联网访问、浏览这个网页的自然人。访问的一个电脑客户端为一个访客,一天内同一个访客仅被计算一次。hyperloglog 的优点是占用内存小,并且是固定的。存储 2^64 个不同元素的基数,只需要 12 KB 的空间。但是也可能有 0.81% 的错误率。
2.8. bitmap位图
bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,或者是0,或者是1,常用来统计只有两个取值的一些变量,下面以统计一周的打卡来说明:
Redis事务
redis事务的本质是一组命令,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行,一次性、顺序性、排他性的执行一组命令。
Redis 事务的命令:
- 开启事务:multi
- 命令入队
- 执行事务:exec
- 撤销事务:discard
在事务执行过程中遇到编译型异常,比如命令有误,事务中的所有指令都不会执行。
事务执行遇到运行时异常,如事务中某条命令执行结果报错,其他命令是可以正常执行的,错误命令抛出异常。
Redis的监视(watch):watch命令可以监控一个或多个key,一旦其中有一个key被修改(或删除),之后的事务就不会执行。监控一直持续到exec命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)。假设我们通过watch命令在事务执行之前监控了多个Keys,倘若在watch之后有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。
另一个线程:
Springboot整合Redis
- 导入redis依赖和fastjson依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
- redis配置
spring.redis.host=localhost
spring.redis.port=6379
- 测试使用
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedis() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "xiaoming");
jsonObject.put("age", 20);
jsonObject.put("job", "student");
// 保存到redis
redisTemplate.opsForValue().set("stu1", jsonObject.toJSONString());
System.out.println(redisTemplate.opsForValue().get("stu1"));
}
}