文章目录

  • 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 服务:

  1. 直接在 Redis 安装目录中运行 redis-cli.exe 文件

  2. 使用 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

设置开机启动:

  1. 打开任务管理器(快捷键ctrl+shift+esc)
  2. 选择服务标签栏
  3. 在服务标签栏下面的菜单打开服务
  4. 在服务管理页面中找到 Redis 服务(可以切换英文输入法,点击R快速定位)
  5. 右键打开 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简介与基本使用相关推荐

  1. Redis简介、特性、优势、应用场景和nosql介绍

    1. nosql介绍 NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库  [不需要分析表与表之间的关系] 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全 ...

  2. 【基础概念】 Redis简介和面试常见问题

    Redis简介和面试常见问题 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起 ...

  3. redis教程(一)之redis简介

    为什么80%的码农都做不了架构师?>>>    redis简介 Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. Redis有三个主 ...

  4. Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)...

    1.NOSQL简介 nosql的产生并不是要彻底的代替关系型数据库,而是作为传统关系型数据库的一个补充. Facebook和360使用Cassandra来存储海量社交数据 Twitter在其url抓取 ...

  5. Redis简介和Redis Template用法整理

    Redis简介 Redis使大规模互联网应用常用的内存高速缓存数据库,它的读写速度非常快.Redis是目前使用最广泛的内存数据存储系统之一.它支持更丰富的数据结构,支持数据持久化.事务.HA(高可用H ...

  6. 1. redis简介

    一. redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串,redis的值支持多种数据类型: (1) ...

  7. Redis简介及安装

    Redis简介及安装 文章目录 Redis简介及安装 一.nosql介绍 1.NoSQL 2.NoSQL和SQL数据库的比较: 二.Redis 1.简介 2.Redis特性 3.Redis 优势 4. ...

  8. Redis数据库(一)——Redis简介、部署及常用命令

    文章目录 一.关系数据库与非关系型数据库概述 1.关系型数据库 2.非关系型数据库 3.关系数据库与非关系型数据库区别 ①.数据存储方式不同 ②.扩展方式不同 ③.对事务性的支持不同 4.非关系型数据 ...

  9. Redis简介及入门

    引入Redis redis的出现是为了解决以下问题现象: 海量用户 高并发 出现此问题现象的罪魁祸首是关系型数据库: 性能瓶颈:磁盘IO性能低下 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解 ...

  10. Redis简介(1)

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...

最新文章

  1. Ubuntu 创建开机自启动脚本的方法
  2. 用阿里云镜像解决Maven速度慢问题
  3. 一次完整的HTTP事务过程--超详细!
  4. 关于android的4.2的0文件夹的详解
  5. [BUUCTF-pwn]——[OGeek2019]babyrop
  6. php文件上传漏洞防御,第十二课 php文件上传漏洞和代码防御
  7. mysql数据备份(windows,linux)
  8. 十大经典排序算法2(Python版本)
  9. 理解java虚拟机有什么用_java虚拟机的作用是什么?我们为什么要用虚拟机?
  10. mysql5.5编译安装_mysql5.5编译安装及配置
  11. win7使用命令提示符怎么运行C语言,Win7如何打开命令行窗口?Win7打开命令提示符的多种方法...
  12. 关于伺服驱动控制的课本_三菱伺服驱动器-说明书.pdf
  13. Ubuntu 16 永久修改ulimit中的max file open限制
  14. java模拟新浪微博用户注册
  15. python 模拟登录超星强智系统
  16. border-color属性设置单边边框和综合四边边框颜色
  17. 【Unity3D】3dsmax中带Vray材质的3D模型的导入
  18. 四大服务器系统,四大厂商八路服务器横向对比 谁是王者?
  19. 【STM32—MDK-ARM】勾选了“Reset and Run”却不起作用,怎么办?
  20. 小程序手势返回以及手机自带返回功能问题解决思路

热门文章

  1. 剖析ArrayList / 计算机程序的思维逻辑
  2. 转载内存授予(memory grants)的理解
  3. 大数据开发工程师是做什么的?
  4. windows启动管理器_如何在Windows 10中打开任务管理器,方法众多,值得收藏
  5. 13张扑克牌排序算法
  6. Quality-Estimation2 (翻译质量评价-在BERT模型后面加上Bi-LSTM进行fine-tuning)
  7. 无人机维修前景怎么样(4点分析无人机专业就业前景)
  8. 华为、苹果、高通,谁在领跑?全面解读清华AI芯片报告
  9. ABP框架 - 我的第一个Web API
  10. 做人最重要的是学会珍惜,爱情如此,人生又何尝不是呢?