时间:2017年05月21日星期日
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...
第一章:课程介绍
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.2
Linux系统:CentOS-6.5
SSH客户端: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
连接Redis
redis-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关联链表存在时,在头部插入value
rpushx key value
仅当指定的key关联链表存在时,在尾部插入value
lrem key count value
在指定的key关联的链表中,删除count个value
当count小于0时,从尾到头删除
当count等于0时,删除所有
当count大于0时,从头到尾删除
lset key index value
在指定的key关联的链表中,修改下标为index的值为value
linsert key before value newvalue
在指定的key关联的链表中,在value之前插入newvalue
linsert key after value newvalue
在指定的key关联的链表中,在value之后插入newvalue
rpoplpush 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对应的分数score
zcard 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 *
获得所有的key
keys my?
获得所有以my开头的key
del key1 key2 key3
删除key1和key2和key3
exists key
查看key是否存在,1、存在;0、不存在
rename oldkey newkey
重命名key,将oldkey重命名为newkey
expire key 1000
设置过期时间。单位:秒
ttl key
查看key所剩超时的时间,如果key没有设置过期时间,则返回-1
type 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.conf
save 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.conf
appendonly:配置AOF持久化是否启用,默认no:不启用
appendfilename:配置AOC持久化文件名称
appendfsync always:每修改一次同步一次,默认不启用,为了更安全,推荐使用
appendfsync everysec:每秒同步一次,默认启用
appendfsync no:不同步,默认不启用
第十章:课程总结
10-1 Redis的课程总结
课程总结
介绍了什么是NoSQL
介绍了什么是Redis
Redis的安装以及简单使用
Jedis的入门,重点掌握,需要通过程序去操作Redis
介绍了Redis常用的数据类型,主要:字符串和哈希
了解keys的通用操作
了解Redis的多数据库和事务
了解Redis的持久化
最主要的还是:要会使用程序操作Redis
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。