Redis笔记
入门简介
入门介绍
在访问量不大的时候,单个数据库完全可以轻松应对
数据存储的瓶颈是什么?
1、数据量的总大小一个机器放不下
2、数据的索引一个机器的内存放不下
3、访问量一个实例不能承受
1)单体mysql的美好年代
2)缓存+mysql+垂直拆分
3)mysql主从读写分离
4)分表分库+水平拆分+mysql集群
为什么使用NoSQL?
数据成倍增加,传统关系型数据库难以支撑
是什么?
NoSQL(Not Only SQL)泛指非关系型数据库
特点
易扩展:数据之间无关系,更容易拓展
高性能
多样灵活的数据模型
NoSQL数据库的四大分类
KV
文档型句酷
列存储数据库
图关系数据库
CAP+BASE
传统的ACID:原子性,一致性, 独立性,持久性
CAP:强一致性,可用性,分区容错性
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个
CA-单点集群:传统Oracle数据库
CP-性能不是很高:Redis
AP-一致性要求低一些:大多数网站
BASE:基本可用、软状态、最终一致
Redis入门
Redis是什么?
分布式内存数据库,基于内存运行
热门NoSQL数据库
Redis:远程字典服务器
Redis特点
支持数据持久化
不仅提供kv类型的数据,同时还提供list、set、zset、hasj等数据结构存储
支持数据的备份
能干嘛
内存存储和持久化
发布、订阅消息系统
定时器、计数器
知识点
数据类型、基本操作和配置
持久化和复制、RDB/AOF
事务的控制
复制
Redis数据类型
String(字符串):1个ket对应一个value
Hash(哈希):类似java的Map
List:有序
Set:无序
Zset:有序集合
Redis键(key)
SELECT index:切换到指定的数据库,数据库索引号 index
用数字值指定,以 0
作为起始索引值。
MOVE key db:将当前数据库的 key
移动到给定的数据库 db
当中。
DBSIZE:返回当前数据库的 key 的数量。
KEYS pattern:查找所有符合给定模式 pattern
的 key
。
**SET key value **:将字符串值 value
关联到 key
。
EXISTS key:检查给定 key
是否存在。
TTL key:以秒为单位,返回给定 key
的剩余生存时间(TTL, time to live)。
EXPIRE key seconds:为给定 key
设置生存时间,当 key
过期时(生存时间为 0
),它会被自动删除。
DEL key [key …]:删除给定的一个或多个 key
。
TYPE key:返回 key
所储存的值的类型。
LPUSH key value [value …]:将一个或多个值 value
插入到列表 key
的表头
LRANGE key start stop:返回列表 key
中指定区间内的元素,区间以偏移量 start
和 stop
指定。
Redis字符串(String)
DEL key [key …]:删除给定的一个或多个 key
。
GET key:返回 key
所关联的字符串值。
APPEND key value:如果 key
已经存在并且是一个字符串,将 value
追加到 key
原来的值的末尾。如果 key
不存在, 就简单地将给定 key
设为 value
,就像执行 SET key value
一样。
STRLEN key:返回 key
所储存的字符串值的长度。
INCR key:将 key
中储存的数字值增一,如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
DECRBY key decrement:将 key
所储存的值减去减量 decrement
。
GETRANGE key start end:返回 key
中字符串值的子字符串,字符串的截取范围由 start
和 end
两个偏移量决定(包括 start
和 end
在内)。
SETRANGE key offset value:用 value
参数覆写(overwrite)给定 key
所储存的字符串值,从偏移量 offset
开始。
SETEX key seconds value:将值 value
关联到 key
,并将 key
的生存时间设为 seconds
(以秒为单位)。
SETNX key value:将 key
的值设为 value
,当且仅当 key
不存在。
MSET key value [key value …]:同时设置一个或多个 key-value
对。
MGET key [key …]:返回所有(一个或多个)给定 key
的值。
MSETNX key value [key value …]:同时设置一个或多个 key-value
对,当且仅当所有给定 key
都不存在。
Redis列表(List)
LPUSH key value [value …]:将一个或多个值 value
插入到列表 key
的表头
RPUSH key value [value …]:将一个或多个值 value
插入到列表 key
的表尾(最右边)。
LRANGE key start stop:返回列表 key
中指定区间内的元素,区间以偏移量 start
和 stop
指定。
LPOP key:移除并返回列表 key
的头元素。
RPOP key:移除并返回列表 key
的尾元素。
LINDEX key index:返回列表 key
中,下标为 index
的元素。
LLEN key:返回列表 key
的长度。
LREM key count value:根据参数 count
的值,移除列表中与参数 value
相等的元素。
LTRIM key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
RPOPLPUSH source destination:在一个原子时间内,执行以下两个动作:
- 将列表
source
中的最后一个元素(尾元素)弹出,并返回给客户端。 - 将
source
弹出的元素插入到列表destination
,作为destination
列表的的头元素。
LSET key index value:将列表 key
下标为 index
的元素的值设置为 value
。
LINSERT key BEFORE|AFTER pivot value:将值 value
插入到列表 key
当中,位于值 pivot
之前或之后。
- 它是一个字符串链表,left,right都可以插入添加;
- 如果键不存在,创建新的链表;
- 如果键已存在,新增内容;
- 如果值全移除,对应的键也就消失了;
- 链表的操作无论是头和尾效率都极高,单假如是对中间元素进行操作,效率就很低下了。
Redis集合(Set)
SADD key member [member …]:将一个或多个 member
元素加入到集合 key
当中,已经存在于集合的 member
元素将被忽略。
SCARD key:返回集合 key
的基数(集合中元素的数量)。
SREM key member [member …]:移除集合 key
中的一个或多个 member
元素,不存在的 member
元素会被忽略。
SRANDMEMBER key [count]:如果命令执行时,只提供了 key
参数,那么返回集合中的一个随机元素。
SMOVE source destination member:将 member
元素从 source
集合移动到 destination
集合。
SDIFF key [key …]:返回一个集合的全部成员,该集合是所有给定集合之间的差集。
SINTER key [key …]:返回一个集合的全部成员,该集合是所有给定集合的交集。
Redis哈希(Hash)
HSET key field value:将哈希表 key
中的域 field
的值设为 value
。
HGET key field:返回哈希表 key
中给定域 field
的值。
HMSET key field value [field value …]:同时将多个 field-value
(域-值)对设置到哈希表 key
中。
HMGET key field [field …]:返回哈希表 key
中,一个或多个给定域的值。
HGETALL key:返回哈希表 key
中,所有的域和值。
HDEL key field [field …]:删除哈希表 key
中的一个或多个指定域,不存在的域将被忽略。
HEXISTS key field:查看哈希表 key
中,给定域 field
是否存在。
HKEYS key:返回哈希表 key
中的所有域。
HVALS key:返回哈希表 key
中所有域的值。
HINCRBY key field increment:为哈希表 key
中的域 field
的值加上增量 increment
。
HINCRBYFLOAT key field increment:为哈希表 key
中的域 field
加上浮点数增量 increment
。
HSETNX key field value:将哈希表 key
中的域 field
的值设置为 value
,当且仅当域 field
不存在。
Redis有序集合Zset(sorted set)
在set基础上,加一个score值
ZADD key score member [[score member] [score member] …]:将一个或多个 member
元素及其 score
值加入到有序集 key
当中。
**ZRANGE key start stop [WITHSCORES]**返回有序集 key
中,指定区间内的成员。其中成员的位置按 score
值递增(从小到大)来排序。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:返回有序集 key
中,所有 score
值介于 min
和 max
之间(包括等于 min
或 max
)的成员。有序集成员按 score
值递增(从小到大)次序排列。
ZREM key member [member …]:移除有序集 key
中的一个或多个成员,不存在的成员将被忽略。
ZCARD key:返回有序集 key
的基数。
ZCOUNT key min max:返回有序集 key
中, score
值在 min
和 max
之间(默认包括 score
值等于 min
或 max
)的成员的数量。
ZREVRANK key member:返回有序集 key
中成员 member
的排名。其中有序集成员按 score
值递减(从大到小)排序。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]:返回有序集 key
中, score
值介于 max
和 min
之间(默认包括等于 max
或 min
)的所有的成员。有序集成员按 score
值递减(从大到小)的次序排列。
配置文件(Redis.conf)
daemonize no:是否以守护进程的方式运行
pidfile/var/run/redis/pid:pid写入指定文件
port 6379:指定Redis监听端口
bind 127.0.0.1:绑定的主机地址
timeout 300 :闲置关闭时长
loglevel verbose:日志记录级别
logfile stdout:日志记录方式
. . .
Redis的持久化(rdb+aof)
RDB
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
Redis事务
可以一次执行多个命令,本质是一组命令的集合。
一个队列中,一次性、顺序性、排他性的执行一系列命令
Redis事务命令
MULTI:标记一个事务块的开始。
EXEC: 执行所有事务块内的命令。
DISCARD :取消事务,放弃执行事务块内的所有命令。
悲观锁and乐观锁
悲观锁
每次拿数据的时候都认为别人会修改,所以每次在哪数据的时候都会上锁
乐观锁
每次拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以是用版本号等机制。
CAS
watch监控
[WATCH key key …]:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
UNWATCH:取消 WATCH 命令对所有 key 的监视。
Watch指令,类似乐观锁,事务提交时,如果key的值已被别的客户端改变,整个事务队列都不会被执行
Redis的发布订阅
进程间的一种消息通信模式:发布者发送消息,订阅者接收消息
一般企业不用redis作为消息中间件使用
Jedis
redis基本操作
Jedis jedis=new Jedis("127.0.0.1",6379);
System.out.println(jedis.ping());
jedis.set("k10","v10");
Set<String> set=jedis.keys("*");
System.out.println(set);
redis事务
Transaction transaction=jedis.multi();
transaction.set("key","value");
transaction.exec();
s
redis基本操作
Jedis jedis=new Jedis("127.0.0.1",6379);
System.out.println(jedis.ping());
jedis.set("k10","v10");
Set<String> set=jedis.keys("*");
System.out.println(set);
redis事务
Transaction transaction=jedis.multi();
transaction.set("key","value");
transaction.exec();