时间:2017年05月21日星期日
说明:本文部分内容均来自慕课网。@慕课网:教学示例源码:无个人学习源码:第一章:课程介绍
1-1 课程介绍
课程介绍
NoSQL的概述Redis的概述Redis的安装和使用Jedis的入门Redis的数据类型Keys的通用操作Redis的特性Redis的持久化
第二章:NoSQL概述
2-1 NoSQL的概述
什么是NoSQL
NoSQL = Not Only SQL非关系型数据库
为什么需要NoSQL
High performance 高并发读写Huge Storage 海量数据的高效率存储和访问High Scalability && High Availability 高可扩展性和高可用性
主流的NoSQL产品
NoSQL数据库的四大分类
键值对(Key-Value)存储:Redis 优:快速查询 劣:存储的数据缺少结构化列存储:HBase 优:快速查询、扩展性强 劣:功能相对局限文档数据库:MongoDB 优:数据结构要求不是很严格 劣:查询性能不高、缺少统一的查询语法图形数据库:InfoGrid 优:利用图结构相关算法 劣:需要对整个图做计算才能得出结果、不容易做分布式集群方案
四类NoSQL数据库比较
NoSQL的特点
易扩展灵活的数据模型大数据量、高性能高可用
第三章:Redis概述
3-1 Redis的概述
Redis高性能键值对数据库,支持的键值数据类型:
字符串类型列表类型有序集合类型散列类型集合类型
Redis的应用场景
缓存任务队列网站访问统计数据过期处理应用排行榜分布式集群架构中的session分离
第四章:Redis的安装和使用
4-1 Redis的安装
Windows安装Redis搭建环境
虚拟机:VMware 10.0.2Linux系统:CentOS-6.5SSH客户端:SecureCRT 7.3 , SecureFX 7.3
推荐使用在Linux系统下docker安装Redis,需先安装docker
下载镜像docker pull hub.c.163.com/library/redis:latest运行镜像docker run --name myredis -d -p 6379:6379 hub.c.163.com/library/redis进入容器docker exec -it CONTAINERID /bin/bash连接Redisredis-cli 172.17.0.1:6379 或 redis-cli发送命令发送ping,回复PONG即代表Redis安装成功
第五章:Jedis的入门
5-1 Jedis入门
Jedis介绍
Jedis是Redis官方首选的Java客户端开发包https://github.com/xetorthio/jedis
测试项目环境搭建
使用gradle作为构建工具。详情见源码。
代码演示:
package com.myimooc.jedis;import org.junit.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** * Jedis的测试 * Created by ChangComputer on 2017/5/21. */public class JedisDemo1 { /** * 单实例的测试 */ @Test public void demo1(){ // 1.设置IP地址和端口 Jedis jedis = new Jedis("192.168.77.128",6379); // 2.保存数据 jedis.set("name","myimooc"); // 3.获取数据 String value = jedis.get("name"); System.out.println(value); // 4.释放资源 jedis.close(); } /** * 使用连接池方式连接 */ @Test public void demo2(){ // 获得连接池的配置对象 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 设置最大连接数 jedisPoolConfig.setMaxTotal(30); // 设置最大空闲连接数 jedisPoolConfig.setMaxIdle(10); // 获得连接池 JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.77.128",6379); // 通过连接池获得连接 Jedis jedis = jedisPool.getResource(); // 设置数据 jedis.set("name","张三"); // 获取数据 String value = jedis.get("name"); System.out.println(value); // 释放资源 jedis.close(); // 释放连接池 jedisPool.close(); }}
第六章:Redis的数据结构
6-1 字符串
五种数据类型:
字符串(String)哈希(hash)字符串列表(list)字符串集合(set)有序字符串集合(sorted set)字符串集合(set)
Key定义的注意点:
不要过长:最好不要超过1024个字节不要过短:太短不利于阅读,如a统一的命令规范
存储String
二进制安全的,存入和获取的数据相同Value最多可以容纳的数据长度是512M
存储String常用命令
赋值:set key value取值:get key获取值:getset key value删除:del key数值增减:incr key decr key扩展命令:incrby key number decrby key number追加命令:append key str
6-2 哈希
存储Hash
String Key和String Value的map容器每一个Hash可以存储4294967295个键值对
存储Hash常用命令:
赋值:hset name key value hmset name key value key value取值:hget name key hmget name key key hgetall name删除:hdel name key del name增加数字:hincrby name key number自学命令:hexists name key hlen name hkeys name hvals name
6-3 list
存储list
ArrayList使用数组方式LinkedList使用双向链接方式双向链表中增加数据双向链表中删除数据
存储list常用命令
两端添加
lpush key value1 value2 value3将value1和value2和value3放入为key的链表,当key不存在时,会自动创建该链表。 当key对应的链表存在时,从左侧插入数据。rpush key value1 value2 value 3从右侧插入数据。
查看列表
lrange key start end查看为key的链表,从指定start开始,到end结束
两端弹出
lpop key左边弹出,返回并弹出指定的key所关联链表的头部(第一个)元素rpop key右边弹出,返回并弹出指定的key所关联链表的尾部(最后一个)元素
获取列表元素个数
llen key返回指定key所关联链表的长度,当key不存在时,返回0
扩展命令
lpushx key value仅当指定的key关联链表存在时,在头部插入valuerpushx key value仅当指定的key关联链表存在时,在尾部插入valuelrem key count value在指定的key关联的链表中,删除count个value 当count小于0时,从尾到头删除 当count等于0时,删除所有 当count大于0时,从头到尾删除lset key index value在指定的key关联的链表中,修改下标为index的值为valuelinsert key before value newvalue在指定的key关联的链表中,在value之前插入newvaluelinsert key after value newvalue在指定的key关联的链表中,在value之后插入newvaluerpoplpush key1 key2将key1里面的第一个值弹出压入key2头部
rpoplpush使用场景
6-4 set
存储Set
和List类型不同是,Set集合中不允许出现重复的元素Set可包含的最大元素数量是4294967295
添加元素
sadd key value1 value2 value3将value1和value2和value3添加到key的set集合
删除元素
srem key value1 value2删除为key的set集合里面的value1和value2
获得集合中的元素
smembers key获取为key的set集合中的元素sismember key value1判断value1是否存在于key的set集合中。1、存在;0、不存在
集合中的差集运算
sdiff key1 key2获取在key1中存在,在key2中不存在的元素。跟key的顺序相关
集合中的交集运算
sinter key1 key2获取在key1和key2中都存在的元素
集合中的并集运算
sunion key1 key2获取key1中和key2中的所有元素,元素重复时,会去掉一个重复的元素
扩展命令
scard key获得为key的set集合中成员的数量srandmember key随机返回为key的set集合中的某个成员sdiffstore newKey key1 key2将两个集合key1和key2差集的元素存储到另一个集合newKey中sinterstore newKey key1 key2将两个集合key1和key2交集的元素存储到另一个集合newKey中sunionstore newKey key1 key2将两个集合key1和key2并集的元素存储到另一个集合newKey中
使用场景
跟踪一些具有唯一性的数据。比如访问某个博客的唯一IP地址的信息,仅需要在每次访问该博客的时候,将访问者的IP存入redis当中。充分利用set类型的服务器端聚合操作的方便、高效的特性,可以用于维护数据对象之间的关联关系。比如:所有购买某一电子设备的客户的ID,被存储到一个指定的set当中,而购买另外一种电子产品客户的ID,被存储到另外一个set当中,如果此时想获得有哪些客户同时购买了这两种商品,那么这时候,可以使用它们的交集操作即可。
6-5 sorted-set
Sorted-Set概述
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。
Sorted-Set常用命令
添加元素
zadd key score1 value1 score2 value2 score3 value3添加三个元素到名为key的Sorted-Set集合中。每一个元素都有一个分数score和值value
获得元素
zscore key value获得名为key的Sorted-Set集合中value对应的分数scorezcard key获得名为key的Sorted-Set集合中成员的数量
删除元素
zrem key value1 value2删除名为key的Sorted-Set集合中的值value1和value2元素
范围查询
zrange key start end查找在start和end之间的元素,默认由分数从小到大排序zrange key start end withscores查找在start和end之间的元素,并显示元素的分数zrevrange key start end withscores查找在start和end之间的元素,并显示元素的分数,分数从大到小排序zremrangebyrank key start end按照指定范围删除元素zremrangebyscore key startscore endscore按照指定分数的范围删除元素
扩展命令
zrangebyscore key startscore endscore withscore limit startindex count返回分数在指定范围之间的元素,分数从小到大排序,从下标为startindex开始,显示count个zincrby key addscore value给指定value元素的分数score增加addscore分zcount key startscore endscore获取分数在某个范围之间元素的个数
使用场景
在游戏的排名上。大型游戏的积分排行榜,每当玩家的分数发生变化时, 可以执行zadd命令去更新玩家的分数微博上的热点话题构建索引数据
第七章:Redis的通用命令
7-1 Redis的Keys的通用操作
Keys通用操作
keys *获得所有的keykeys my?获得所有以my开头的keydel key1 key2 key3删除key1和key2和key3exists key查看key是否存在,1、存在;0、不存在rename oldkey newkey重命名key,将oldkey重命名为newkeyexpire key 1000设置过期时间。单位:秒ttl key查看key所剩超时的时间,如果key没有设置过期时间,则返回-1type key获得指定key的数据类型
第八章:Redis的事务
8-1 Redis的特性
相关特性
多数据库Redis事务
多数据库
一个Redis实例可以包含多个数据库,客户端可以指定连接哪个数据库。一个Redis实例最多可以提供16个数据库,下标从0到15,客户端默认连接0号数据库。通过select选择连接到哪个数据库。
多数据库相关命令
select 1连接到1号数据库move key 1将key移动到1号数据库
Redis事务相关命令
multi开启事务,后面执行的命令会被存到命令队列当中,直到执行提交事务命令exec提交事务,命令队列里面的命令会被原子化执行discard回滚事务
第九章:Redis的持久化
9-1 Redis的持久化的概述
持久化使用的方式
RDB持久化:默认支持,不需要进行配置。在指定的时间间隔内,将内存中的数据及快照写入到磁盘AOC持久化:将以日志形式,记录服务器所处理的每一个操作,在redis服务器启动之初, 会读取该文件,重新构建数据库,保证启动后数据的完整性无持久化:通过配置来禁用redis服务器持久化的功能,这时候,redis就是一个缓存机制同时使用RDB和AOF
9-2 RDB方式持久化
RDB方式持久化优势
只包含一个文件,方便文件备份对于灾难恢复而言,RDB是一个非常不错的选择性能最大化,由子进程完成持久化操作相比AOF,大数据集启动效率更高
RDB方式持久化缺点
如果想保证数据的高可用性,即最大限度的避免数据的丢失,RDB将不是一个很好的选择。当系统在定时持久化之前出现宕机,还未来得及往硬盘写入数据,那数据就丢失了。当数据集过大时,可能会导致服务器停止几百毫秒甚至是1秒钟。
RDB方式持久化配置
redis.confsave 900 1:每900秒,至少有1个key发生变化,会持久化一次save 300 10:每300秒,至少有10个key发生变化,会持久化一次save 60 10000:每60秒,至少有10000个key发生变化,会持久化一次dbfilename:配置持久化文件名称dir:配置持久化文件保存路径,默认./配置文件当前路径
9-3 AOF方式持久化
AOF方式持久化优势
带来更高的数据安全性,每秒同步或每修改同步或不同步对于日志文件写入操作采用追加模式,当写入过程中出现宕机时,不会破坏已经存在的内容如果日志过大,redis会自动启动重写机制AOF包含格式清晰、易于理解的日志文件记录所有的修改操作,通过该文件可完成数据重建
AOF方式持久化劣势
对于相同数据集而言,AOF的文件要比RDB的文件大一些根据同步策略的不同,运行效率要低于RDB
AOF方式持久化配置
redis.confappendonly:配置AOF持久化是否启用,默认no:不启用appendfilename:配置AOC持久化文件名称appendfsync always:每修改一次同步一次,默认不启用,为了更安全,推荐使用appendfsync everysec:每秒同步一次,默认启用appendfsync no:不同步,默认不启用
第十章:课程总结
10-1 Redis的课程总结
课程总结
介绍了什么是NoSQL介绍了什么是RedisRedis的安装以及简单使用Jedis的入门,重点掌握,需要通过程序去操作Redis介绍了Redis常用的数据类型,主要:字符串和哈希了解keys的通用操作了解Redis的多数据库和事务了解Redis的持久化
最主要的还是:要会使用程序操作Redis