1 | #redis.conf |
Redis学习笔记(一)
Posted on
Edited on
感觉已经到了不得不学Redis的时候了。。
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的key-value存储数据库。有几大特点:
- 开源单线程
- 内存操作
- 多种数据结构
- 支持事务
- 持久化
- 高可用、分布式
- 主从复制
支持的数据结构
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
字符串
字符串就是一对kv串,而对应的value可以是任意数据,比如jpg图片等,最大能存储 512MB
1 | SET name "hello" |
| hello | world |
|---|---|
| counter | 1 |
| bits | bits |
哈希
哈希是键值对集合,是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。每个 hash 可以存储 232 -1 键值对(40多亿)。
1 | HMSET myhash field1 "Hello" field2 "World" |
列表
列表是简单的字符串列表,按照插入顺序排序。
无序集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
无序集合如何保证集合中的元素唯一?在添加之前会做两件事
- 判断值是否相等
- 判断hashcode是否相等
有序集合
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数(score)来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
数据类型内部编码
数据库事务的四大特性
Posted on
Edited on
1、原子性(Atomicity)
- 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
2、一致性(Consistency)
- 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
3、隔离性(Isolation)
- 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
4、持久性(Durability)
- 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
那么问题来了。当数据库的并发高的时候会出现什么问题呢?
数据库事务的高并发问题
1、脏读
- 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读
- 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
3、幻读
- 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
- T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后T1在此读取该表会多出几行。
MySQL数据库事务的隔离级别
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(read-uncommitted) | √ | √ | √ |
| 不可重复读(read-committed) | × | √ | √ |
| 可重复读(repeatable-read) | × | × | √ |
| 串行化(serializable) | × | × | × |
说明:
- 事务隔离级别为读提交时,写数据只会锁住相应的行
- 事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
- 事务隔离级别为串行化时,读写数据都会锁住整张表
- 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
参考文章:MySQL的四种事务隔离级别


