Redis简介与基本使用
文章目录
- Redis简介与基本使用
- 一、下载地址
- 二、连接 redis
- 三、五大基本数据类型相关操作指令
- 3.1 字符串 string
- 3.2 列表 list
- 3.3 集合 set
- 3.4 哈希表 hash
- 3.5 有序集合 Zset
- 四、特殊数据类型
- 4.1 geospatial 地理位置
- 4.2 Hyperloglogs
- 4.3 bitmaps
- 五、Redis 事务
- 六、Redis 乐观锁 watch
- 七、Jedis 使用
- 八、Spring-Data-Redis 使用
- 8.1 自带 RedisTemplate
- 8.2 实例测试
- 8.3 常用方法封装
- 九、Redis 配置文件 redis.conf
- 9.1 网络 NETWORK
- 9.2 通用配置 GENERAL
- 9.3 快照 SNAPSHOTTING
- 9.4 安全 SECURITY
- 十、持久化
- 10.1 RDB 持久化
- 10.2 AOF持久化
- 十一、Redis 发布订阅
Redis简介与基本使用
随着互联网项目的扩展和用户量的提高,传统的关系型数据库对于大规模的高并发场景显得力不从心,而NoSQL由其本身易扩展、高性能、灵活数据模型、高可用等特点得到了非常迅速的发展。
Redis(Remote Dictionary Server ),即远程字典服务,是一款非关系型数据库,完全开源,遵守BSD协议。
Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis的特点:
- 内存存储,关闭就丢失
- 支持数据持久化(RDB、AOF)
- 效率高、速度快
- 多样化的数据类型
- 基于内存操作,单线程效率高,无多线程上下文切换
Redis 默认拥有 16 个数据库,默认使用第 0 个(索引),可以使用 select [index]
来切换数据库,可以在配置文件中找到相应的配置项database 16
一、下载地址
redis 官网:https://redis.io/download/
官网只提供了 Linux 和 Mac 系统的版本,Windows 版本需要去 Github 下载,地址:https://github.com/microsoftarchive/redis/releases
对于 windows 版本,有积分的小伙伴也可以去本站下载:https://download.csdn.net/download/qq_44713454/85237032,下载文件中包含了安装版本和免安装版本,根据需要选择一个即可,后文将以 windows 版本的 Redis 进行展开。
二、连接 redis
启动 Redis 服务:
redis-server.exe redis.windows.conf
连接 Redis 服务:
直接在 Redis 安装目录中运行
redis-cli.exe
文件使用 cmd 命令
redis-cli -h host -p port -a passwordredis-cli.exe -h 127.0.0.1 -p 6379
如果想开机自启动Redis服务,需要将Redis服务注册到 windows 服务,并且设置成自动启动
安装 Redis 服务(进入安装目录输入以下命令):
redis-server --service-install redis.windows.conf
设置开机启动:
- 打开任务管理器(快捷键ctrl+shift+esc)
- 选择服务标签栏
- 在服务标签栏下面的菜单打开服务
- 在服务管理页面中找到 Redis 服务(可以切换英文输入法,点击R快速定位)
- 右键打开 Redis 的属性,将常规中的启动类型设置成自动或自动(延迟启动)
三、五大基本数据类型相关操作指令
Key 相关操作:
keys * # 查看所有 key
set [key] [val] # 添加键值对
get [key] # 获取值
exists [key] # 判断是否存在 0 不存在 1 存在
del [key] # 删除 key
move [key] [db] # 移动数据到其他库
expire [key] [second] # 设置过期时间,单位为秒
ttl [key] # 查看 key 的存活时间
type [key] # 查看数据类型
3.1 字符串 string
append [key] [val] # 追加字符串,返回字符长度,不存在则新增
strlen [key] # 返回字符长度incr [key] # 自增 1
decr [key] # 自减 1incrby [key] [increment] # 自增指定大小
decrby [key] [increment] # 自减指定大小getrange [key] [start] [end] # 截取字符串,两边都是闭区间,[0,-1] 表示全部
setrange [key] [offset] [val] # 从指定位置开始覆盖值setex [key] [seconds] [value] # 将 val 关联到 key 并设置过期时间
setnx [key] [key] [value] # 只有 key 不存在,才设置 key 的值(分布式锁中常用),如果存在则设置失败mset [k1] [v1] [k2] [v2] ... # 批量设置值
mget [k1] [k2] ... # 批量获取值
msetnx [k1] [v1] [k2] [v2] ... # 不存在时才设置,原子性操作getset [key] [val] # 先获取再设值,返回get的值,类似先弹栈再入栈的效果# 设置对象
mset user:1:name zhangsan user:1:age 18
3.2 列表 list
Lpush [key] [element1] [element2] ... # 从左边插入一个或多个元素
Rpush [key] [element1] [element2] ... # 从右边插入一个或多个元素
Lrange [key] [start] [end] # 获取指定范围的列表值 [start,end] 获取所有则是 [0,-1]
Lpop [key] [count] # 从左边弹出 count 个元素,不指定则弹出一个
Rpop [key] [count] # 从右边弹出 count 个元素,不指定则弹出一个
Lindex [key] [index] # 通过 index 获取值
Llen [key] # 查看 list 长度Lrem [key] [count] [element] # 移除指定个数的指定元素
Ltrim [key] [start] [stop] # 仅保留指定范围的元素RpopLpush [source] [destination] # 将 source 中最右边的元素弹出并插入到 destination 的左边
LpopLpush [source] [destination] # 将 source 中最左边的元素弹出并插入到 destination 的左边Lset [key] [index] [element] # 指定列表的下标设置值,更新操作,不存在会报错
Linsert [key] [before|after] [pivot] [element] # 在指定元素的前面或后面插入新元素,从左到右进行查找
- list 实际上是一个链表,可以在 node 的左右插值,可以在链表的首尾插值
- list 不存在空的情况,如果 list 为空,那么就会消失。
- 用作队列:
lpush
rpop
- 用作栈:
lpush
lpop
3.3 集合 set
Sadd [key] [member1] [member2] ... # 添加元素
Smembers [key] # 查看所有元素
SisMember [key] [member] # 判断是否包含某个元素
Scard myset # 计算元素个数
Srem [key] [member1] [member2] ... # 移除元素
Srandmember [key] [count] # 随机从 set 中获取指定个元素
Spop [key] [count] # 随机弹出 count 个元素
Smove [source] [destination] [member] # 将指定元素从 source 中移动到 destination 中
Sdiff [key1] [key2] ... # 查看 key1 与后面集合的并集之间的差异
Sinter [key1] [key2] ... # 查看指定的所有集合之间的交集
Sunion [key1] [key2] ... # 查看集合之间的并集
- 无序不重复集合
- 可以求交集、差集和并集
3.4 哈希表 hash
存储结构为 Key-Map,value 也会有 key - val
Hset [key] [field1] [val1] [field2] [val2] ... # 给 hash 的 field 设置 val
Hget [key] [field] # 获取单个指定字段值
Hmget [key] [field1] [field2] ... # 获取多个指定字段值
Hgetall [key] # 获取所有的 field 和 val
Hdel [key] [field1] [field2] ... # 删除指定的 field
Hlen [key] # 查看长度
Hexists [key] [field] # 判断是否存在
Hkeys [key] # 查看所有的 field
Hvals [key] # 查看所有的 valueHincrby [key] [field] [increment] # 对 hash 的字段的值自增,如果增值为负数,则为自减
Hsetnx [key] [field] [value] # 不存在才能设值,如果存在则失败
- Hash 与 String 很像,Hash 更适合存储对象,String 更适合存储字符串。
3.5 有序集合 Zset
# 添加
Zadd [key] [NX|XX] [GT|LT] [CH] [INCR] [score1] [member1] [score2] [member2] ...
# 查看
Zrange [key] [min] [max]
Zcard [key] # 元素个数
Zcount [key] [min] [max] # 计算区间的元素个数
# 排序,-inf +inf 分别无穷小与无穷大
Zrange [key] [min] [max] [byscore|bylex] [rev] [limit offset count] # 按照索引顺序排序
Zrevrange [key] [start] [stop] [withscores] # 在
Zrangebyscore [key] [min] [max] [withscores] [limit offset count] # 在[min,max]范围内升序排列
Zrevrangebyscore [key] [max] [min] [withscores] [limit offset count] # 在[max,min]范围内降序排列
# 移除
zrem [key] [member1] [member2] ... # 移除
- 排行榜应用
四、特殊数据类型
4.1 geospatial 地理位置
朋友定位、附近的人,打车距离计算。
Redis 的 Geo 在 3.2 版本推出,可以推算地理位置信息,两地之间的距离,方圆几里的人。
# 添加
geoadd [key] [NX|XX] [CH] [longitude] [latitude] [member] # 添加地理位置(经度 纬度 名称)
# 查询
geopos [key] [member...] # 返回经纬度
geodist [key] [member1] [member2] [m|km|ft|mi] # 返回两个地点之间的直线距离,可以指定单位
georadius [key] [longitude] [latitude] [radius] [m|km|ft|mi] # 以给定经纬度找出某一半径内的元素
# [withcoord] 显示他人定位信息
# [withdist] 显示到中心位置的距离
# [count n] 限制 n 个结果
georadiusbymember [key] [longitude] [latitude] [radius] [m|km|ft|mi] # 以某个元素为中心查询
geohash [key] [member...] # 将二维的经纬度换位一维的字符串,两个字符串越接近,距离越近
zrange # 查看 member 列表
zrem # 删除
geoadd china:city 116.10 39.90 beijing 121.47 31.23 shanghai 106.50 29.53 chongqing 114.05 22.52 shenzheng 120.16 30.24 hangzhou 108.93 34.26 xian
4.2 Hyperloglogs
Hyperloglogs 是做基数统计的算法,存在0.81%的误差,基数:不重复的元素个数。
占用空间大小固定 12kb
PFadd key element... # 添加元素
PFcount key... # 统计元素的基数
PFmerge key destkey sourcekey... # 合并
允许容错,才使用 Hyperloglogs。
4.3 bitmaps
位存储,统计用户信息,活跃、不活跃、登录、未登录、打卡
通过操作二进制位来记录数据,多用于只有两种状态的数据存储。
setbit key offset value # 设置 offset 的状态
getbit key offset # 查看 offset 的状态
bitcount key [start|end] # 查看设置为 1 的数量,可以指定顺数 start 位和倒数 end 位,start>=0 ent <0
五、Redis 事务
事务:将一组命令放在同一个事务中进行批量处理。
Redis事务相关命令:
- MULTI:开启事务
- EXEC:执行事务
- DISCARD:放弃执行
- WATCH:监听,如果执行事务前,监听的值被改变,事务将被打断
事务是一个单独的隔离操作:
- 事务中的所有命令都会序列化、按顺序地执行。
- 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:
- 事务中的命令要么全部被执行,要么全部都不执行。
- Redis 单条命令保证原子性,但事务不保证原子性,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
- Redis 事务没有隔离级别
Redis 事务执行过程:开启事务(MULTI)->命令入队(…)->执行事务(exec)
六、Redis 乐观锁 watch
watch key [key ...] # 监视
- 在一个事务中修改了 watch 监听字段,如果其他线程修改了该事务中未提交的数据,事务会执行失败。
事务失败解决:先解除监听,再监听新数据,继续执行事务。
unwatch # 解锁
watch key # 监视新值
multi # 重新执行事务
...
exec
七、Jedis 使用
- 引入 pom 依赖
<dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency>
</dependencies>
- 测试使用
public static void main(String[] args) {// 指定连接 Ip 和端口Jedis jedis = new Jedis("192.168.33.10", 6379);System.out.println(jedis.ping()); // 输出 PONG
}
- 方法名与命令名一致。
八、Spring-Data-Redis 使用
Spring Boot 2.x 后将 jedis 替换成了 lettuce
jedis:采用直连,多个线程操作不安全,需要使用连接池,更像BIO模式。
lettuce:采用 netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像NIO模式。
8.1 自带 RedisTemplate
@Bean
@ConditionalOnMissingBean(name = {"redisTemplate"})
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {// 默认的 RedisTemplate 没有过多的设置,redis 对象都是需要序列化// key 和 val 都是 Object,使用时需要强制转换 <String,Object>RedisTemplate<Object, Object> template = new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;
}// string 是 redis 中最常用的数据类型,所以有一个默认 StringRedisTemplate 来操作 string 类型
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;
}
8.2 实例测试
- 引入 pom 依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--springboot 2.x 后将 jedis 替换成了 lettuce --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
</dependencies>
- 在
application.yml
中配置 redis
spring:redis:host: 127.0.0.1 # 默认 localhostport: 6379 # 默认6379
- 测试使用
@SpringBootTest
public class SpringBootApplicationTest {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid contextLoads() {// redisTemplate 操作不同的数据类型,api 与指令一样// opsForValue 操作字符串// opsForList 操作列表// opsForSet 操作集合// opsForHash 操作哈希// opsForZSet 操作 ZSet// opsForGeo 操作 geospatial// opsForHyperLogLog 操作 Hyperloglogs// 操作连接数据库//RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();//connection.flushDb();//connection.flushAll();//connection.select(0);redisTemplate.opsForValue().set("name", "贾克斯");System.out.println(redisTemplate.opsForValue().get("name"));}
}
底层默认使用
JdkSerializationRedisSerializer
序列化,会将 key 进行编码。
- 自定义 RedisTemplate
@Configuration
public class RedisConfig {/*修改泛型为 <String, Object>配置 key 的序列化*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {RedisTemplate<String, Object> template = new RedisTemplate<>();// key 使用 string 的序列化方式StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();template.setKeySerializer(stringRedisSerializer);template.setHashKeySerializer(stringRedisSerializer);// value 的序列化使用 jackson2JsonRedisSerializerJackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.setConnectionFactory(redisConnectionFactory);return template;}}
8.3 常用方法封装
@Component
public final class RedisUtils {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 设置 key 的存活时间(秒)*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 获取 key 的存活时间*/public long getExpire(String key) {Long time = redisTemplate.getExpire(key, TimeUnit.SECONDS);return time == null ? -1 : time;}/*** 判断 key 是否存在*/public boolean hasKey(String key) {Boolean hasKey = redisTemplate.hasKey(key);return hasKey != null && hasKey;}/*** 移除 key*/public void del(String key) {redisTemplate.delete(key);}public void del(Collection<String> keys) {redisTemplate.delete(keys);}/*** 获取*/public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 设置值*/public void set(String key, Object obj) {redisTemplate.opsForValue().set(key, obj);}/*** 设置值时添加缓存时间*/public void set(String key, Object obj, long time) {redisTemplate.opsForValue().set(key, obj, time);}/*** 自增长* @param gap 正数为增长、负数为减少*/public long incrBy(String key, long gap) {Long increment = redisTemplate.opsForValue().increment(key, gap);return increment == null ? 0 : increment;}
}
九、Redis 配置文件 redis.conf
配置文件特点:
- 大小单位对大小写不敏感:
units are case insensitive so 1GB 1Gb 1gB are all the same.
导入其他配置文件
include /path/to/local.conf
include /path/to/other.conf
include /path/to/fragments/*.conf
9.1 网络 NETWORK
bind 127.0.0.1 # 绑定IP
protected-mode yes # 保护模式
port 6379 # 端口号
9.2 通用配置 GENERAL
daemonize yes # 以守护进程的方式运行,默认是 no
pidfile /var/run/redis_6379.pid # 如果以后台的方式运行,就需要指定一个 pid 进程文件
loglevel notice # 日志级别
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)logfile "" # 日志的文件位置名
databases 16 # 数据库的数量,默认 16 个
always-show-logo no # 是否显示启动 logo
9.3 快照 SNAPSHOTTING
- 持久化时使用,在规定时间内,执行了多少次操作,则会持久化到 .rdb 或 .aof 文件中。
# 定义规则
save 3600 1 # 3600 秒内,如果至少有一个 key 进行修改,就进行持久化操作
save 300 100 # 300 秒内,如果有 100 个 key 进行修改,就进行持久化操作
save 60 10000 # 60 秒内,如果有 10000 个 key 进行修改,就进行持久化操作stop-writes-on-bgsave-error yes # 持久化如果出错,是否需要继续工作
rdbcompression yes # 是否压缩 rdb 文件,需要消耗一些 cpu 资源
rdbchecksum yes # 是否校验 rdb 文件
dir ./ # rdb 文件保存的路径
- AOF配置
# aof 配置(APPEND ONLY MODE)
appendonly no # 是否开启 aof 模式,默认 no,使用 rdb 持久化,一般 rdb 够用
appendfilename "appendonly.aof" # 持久化的文件名字appendfsync always # 每次修改都会写入 sysn,消耗性能
appendfsync everysec # 每秒执行一次 sysn,可能会丢失这一秒的数据
appendfsync no # 让操作系统同步数据
9.4 安全 SECURITY
requirepass 123456 # 设置密码
maxclients 10000 # 设置能够连接的最大客户端数量
maxmemory <bytes> # 最大内存容量maxmemory-policy noeviction # 内存到达上限后的处理策略
# volatile-lru 只对设置了过期时间的key进行LRU(默认值)
# allkeys-lru 删除lru算法的key
# volatile-random 随机删除即将过期key
# allkeys-random 随机删除
# volatile-ttl 删除即将过期的
# noeviction 永不过期,返回错误,默认方式
# 设置密码访问
config get requirepass
config set requirepass 123456auth 123456 # 验证密码后才能使用命令
十、持久化
Redis有两种持久化策略:RDB(快照)和AOF(记录)
10.1 RDB 持久化
RDB触发规则:
- 满足 save 规则
save 60 5
,60 秒 修改了 5 次,就进行持久化
- 执行
fluashall
命令 - 停止 Redis 服务
RDB 恢复数据:将 .rdb
文件放到 Redis 启动目录即可,Redis 启动时会自动恢复数据,使用命令 config get dir
可以看到快照位置。
优点:
- 适合大规模的数据恢复和对数据完整性要求不高的数据恢复
缺点:
- 需要一定的时间间隔,最后一次的修改数据不会被记录
- fork 进程时需要占用一定的内存空间
10.2 AOF持久化
appendonly yes # 开启 aof
appendfilename "appendonly.aof" # 生成的文件名字auto-aof-rewrite-percentage 100 # 重写的基准值
auto-aof-rewrite-min-size 64mb # 最大值# 同步策略
# appendfsync always # 每次修改都记录
appendfsync everysec # 每秒记录一次
# appendfsync no # 操作系统记录
AOF 文件检测并修复:redis-check-aof --fix appendonly.aof
优点:
- 每次修改都同步,文件更完整。
- 每秒同步一次,最多只会丢失一秒的数据。
缺点:
- aof 远远大于 rdb,恢复速度也比 rdb 慢
- aof 运行效率也比 rdb 慢
十一、Redis 发布订阅
- 发布消息:
publish [频道] [消息]
127.0.0.1:6379> publish jacks "hello"
(integer) 1
127.0.0.1:6379> publish jacks "world"
(integer) 1
127.0.0.1:6379>
- 订阅消息:
subscribe [频道1] [频道2...]
127.0.0.1:6379> subscribe jacks
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "jacks"
3) (integer) 1
1) "message"
2) "jacks"
3) "hello"
1) "message"
2) "jacks"
3) "world"
适用于实时消息系统、实时聊天、订阅与发布系统等场景
Redis简介与基本使用相关推荐
- Redis简介、特性、优势、应用场景和nosql介绍
1. nosql介绍 NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 [不需要分析表与表之间的关系] 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全 ...
- 【基础概念】 Redis简介和面试常见问题
Redis简介和面试常见问题 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起 ...
- redis教程(一)之redis简介
为什么80%的码农都做不了架构师?>>> redis简介 Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. Redis有三个主 ...
- Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)...
1.NOSQL简介 nosql的产生并不是要彻底的代替关系型数据库,而是作为传统关系型数据库的一个补充. Facebook和360使用Cassandra来存储海量社交数据 Twitter在其url抓取 ...
- Redis简介和Redis Template用法整理
Redis简介 Redis使大规模互联网应用常用的内存高速缓存数据库,它的读写速度非常快.Redis是目前使用最广泛的内存数据存储系统之一.它支持更丰富的数据结构,支持数据持久化.事务.HA(高可用H ...
- 1. redis简介
一. redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串,redis的值支持多种数据类型: (1) ...
- Redis简介及安装
Redis简介及安装 文章目录 Redis简介及安装 一.nosql介绍 1.NoSQL 2.NoSQL和SQL数据库的比较: 二.Redis 1.简介 2.Redis特性 3.Redis 优势 4. ...
- Redis数据库(一)——Redis简介、部署及常用命令
文章目录 一.关系数据库与非关系型数据库概述 1.关系型数据库 2.非关系型数据库 3.关系数据库与非关系型数据库区别 ①.数据存储方式不同 ②.扩展方式不同 ③.对事务性的支持不同 4.非关系型数据 ...
- Redis简介及入门
引入Redis redis的出现是为了解决以下问题现象: 海量用户 高并发 出现此问题现象的罪魁祸首是关系型数据库: 性能瓶颈:磁盘IO性能低下 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解 ...
- Redis简介(1)
Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...
最新文章
- Ubuntu 创建开机自启动脚本的方法
- 用阿里云镜像解决Maven速度慢问题
- 一次完整的HTTP事务过程--超详细!
- 关于android的4.2的0文件夹的详解
- [BUUCTF-pwn]——[OGeek2019]babyrop
- php文件上传漏洞防御,第十二课 php文件上传漏洞和代码防御
- mysql数据备份(windows,linux)
- 十大经典排序算法2(Python版本)
- 理解java虚拟机有什么用_java虚拟机的作用是什么?我们为什么要用虚拟机?
- mysql5.5编译安装_mysql5.5编译安装及配置
- win7使用命令提示符怎么运行C语言,Win7如何打开命令行窗口?Win7打开命令提示符的多种方法...
- 关于伺服驱动控制的课本_三菱伺服驱动器-说明书.pdf
- Ubuntu 16 永久修改ulimit中的max file open限制
- java模拟新浪微博用户注册
- python 模拟登录超星强智系统
- border-color属性设置单边边框和综合四边边框颜色
- 【Unity3D】3dsmax中带Vray材质的3D模型的导入
- 四大服务器系统,四大厂商八路服务器横向对比 谁是王者?
- 【STM32—MDK-ARM】勾选了“Reset and Run”却不起作用,怎么办?
- 小程序手势返回以及手机自带返回功能问题解决思路
热门文章
- 剖析ArrayList / 计算机程序的思维逻辑
- 转载内存授予(memory grants)的理解
- 大数据开发工程师是做什么的?
- windows启动管理器_如何在Windows 10中打开任务管理器,方法众多,值得收藏
- 13张扑克牌排序算法
- Quality-Estimation2 (翻译质量评价-在BERT模型后面加上Bi-LSTM进行fine-tuning)
- 无人机维修前景怎么样(4点分析无人机专业就业前景)
- 华为、苹果、高通,谁在领跑?全面解读清华AI芯片报告
- ABP框架 - 我的第一个Web API
- 做人最重要的是学会珍惜,爱情如此,人生又何尝不是呢?