Redis学习笔记整理(黑马程序员视频课程)

目录

 

Redis简介

NoSQL

Redis

Redis的应用

Redis 的数据存储类型介绍

String

string类型数据的操作

hash

hash类型数据的操作

list

list类型数据的操作

set

set类型数据的操作

sorted_set

sorted_set类型数据的操作

key通用操作

key特征

key基本操作

key扩展操作(时效性控制)

key扩展操作(查询模式)

 

key其他操作

数据库通用操作

db相关操作

Jedis简介

客户端连接redis

基于连接池获取连接


Redis简介

NoSQL

NoSQL:即Not-Nnly SQL(泛指菲关系型数据库),作为关系型数据库的补充。

作用:应对基于海量用户和海量数据前提下的数据处理问题。

特征:

  • 可扩容,可伸缩

  • 大数据量下高性能

  • 灵活的数据模型

  • 高可用

常见的NoSQL数据库有:

  • Redis
  • memcache
  • HBase
  • MongoDB

    Redis

概念:Redis(REmote DIctionary Service)是用c语言开发的一个开源的高性能键值对(key-value)数据库。

特征:

1. 数据间没有必然的关联关系

2. 内部采用单线程机制进行工作

3. 高性能。官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s。

4. 多数据类型支持:

  • 字符串类型   String
  • 列表类型   List(LinkedList)
  • 散列类型   hash(HashMap)
  • 集合类型   set(HashSet)
  • 有序集合类型   sorted_set(TreeSet)

5. 持久化支持。可以进行数据灾难恢复

 

Redis的应用

  • 为热点数据加速查询(主要场景),如热点商品,热点新闻,热点资讯,推广类等高访问量信息等

  • 任务队列,如秒杀,抢购、购票排队等

  • 即时信息查询,如各种排行榜,各类网站访问统计,公交到站信息、在线人数信息等

  • 时效性信息控制,如验证码控制,投票控制等

  • 分布式数据共享,如分布式集群架构中的session分离

  • 消息队列

  • 分布式锁


Redis 的数据存储类型介绍

redis自身是一个Map,其中所有的数据都是采用key:value的形式存储。

数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串。 Redis学习笔记整理(黑马程序员视频课程)_第1张图片

 

String

存储单个数据,是最简单的数据存储类型,也是最常用的数据存储类型,一个存储空间保存一个数据。

存储内容通常是字符串。如果字符串以整数的形式展示,可以作为数字操作使用。

Redis学习笔记整理(黑马程序员视频课程)_第2张图片

string类型数据的操作

基本操作:

操作命令 命令功能 例子
set key value 添加或修改数据 set k1 v1
get key 获取数据 get k1
del key 删除数据 del k1
mset key1 value1 key2 value2... 添加或修改多个数据

mset k1 v1 k2 v2...

mget key1key2... 获取多个数据 mget k1 k2...
strlen key 获取数据字符的个数 strlen k1
append key value 追加信息到原始信息后部(如果原始信息存在就追加,否则新建) append k1 v2

 

扩展操作:

操作命令 命令功能

incr key

incrby key increment

incrbyfloat key increment

设置数值数据增加指定范围的值

decr key

decrby key increment

设置数值数据减少指定范围的值

 

  • string在redis内部存储默认就是一个字符串,当遇到增减类操作incr、decr时会转成数值型进行计算。
  • redis所有操作都是原子性的,采用单线程处理所有业务,命令是一个个执行的,一次无需考虑并发带来的数据影响。
  • 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上限的范围,将报错。

 

redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作:

操作命令 命令功能
setex key seconds value 设置数据具有指定生命周期(秒为单位)
psetex key milliseconds value 设置数据具有指定生命周期(毫秒为单位)

 

key的设置约定:

Redis学习笔记整理(黑马程序员视频课程)_第3张图片

 

hash

结构如图,一个key指向一个hash,hash里也是以键值对方式存储数据,即一个存储空间保存多个键值对数据;

底层是使用哈希表结构实现数据存储。

       Redis学习笔记整理(黑马程序员视频课程)_第4张图片

hash类型数据的操作

基本操作:

操作命令 命令功能
hset key field value 添加或修改数据

hget key field

hgetall key

获取数据
hdel key field1 [field2] 删除数据
hlen key 获取hash内数据的条数

 

扩展操作:

操作命令 命令功能

hkeys key

hvals key

获取哈希表中所有的字段名或字段值

hincrby key field increment

hincrbyfloat key field increment

设置指定字段的数值数据增加指定范围的值
hsetnx key field value

用于为哈希表中不存在的的字段赋值。

如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

如果字段已经存在于哈希表中,操作无效。

如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令

 

注意事项:

  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但是hash设计初衷不是为了存储大量对象而设计的,切记不可以滥用,更不可以将hash作为对象列表使用
  • hgetall操作可以获取全部属性,但是如果内部fiel 过多,遍历整体数据效率就会很低,有可能成为数据访问的瓶颈

 

list

有序

可以存储多个数据并对数据进入存储空间的顺序进行区分;

可以保存多个数据,底层使用双向链表存储结构实现;

Redis学习笔记整理(黑马程序员视频课程)_第5张图片

 

list类型数据的操作

基本操作:

操作命令 命令功能

lpush key value1 [value2] ...

rpush key value1 [value2] ...

从链表左边插入数据

从链表右边插入数据

lrange key start stop

获取列表指定范围内的元素,0 表示列表的第一个元素,-1表示最后一个元素
lindex key index 通过索引获取列表中的元素
llen key 获取列表长度

lpop key

rpop key

移出并获取列表的左边第一个元素;

移出并获取列表的右边第一个元素;

 

扩展操作:

操作命令 命令功能

blpop key1 [key2] timeout

 

移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpop key1 [key2] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
lrem key count value

移除列表中与参数 VALUE 相等的元素。

COUNT 的值可以是以下几种:

  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count = 0 : 移除表中所有与 VALUE 相等的值。

注意事项:

  • list中保存的数据都是string类型的,数据总容量是有限的,最多2的32次方-1个元素
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第二页及更多信息通过数据库的形式加载

 

 

set

可以存储大量数据,在查询方面提供更高的效率;

与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的(hashSet)

                  Redis学习笔记整理(黑马程序员视频课程)_第6张图片

 

set类型数据的操作

基本操作:

操作命令 命令功能
sadd key menber1 [menber2] 向集合添加一个或多个成员
smenbers key 返回集合中的所有成员
srem key menber1 [menber2] 移除集合中一个或多个成员
scard key 获取集合的成员数
sismenber key menber 判断 member 元素是否是集合 key 的成员

 

 

扩展操作:

操作命令 命令功能
srandmenber key [count] 返回集合中一个或多个随机数
spop key 移除并返回集合中的一个随机元素

Tip: redis 应用于随机推荐类信息检索,例如热点歌单推荐、热点新闻推荐、热卖旅游路线、应用APP推荐等。

 

操作命令 命令功能
sinter key1 [key2] 求两个集合的交集
sunion key1 [key2] 求两个集合的并集
sdiff key1 [key2] 求两个集合的差集
sinterstore destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
sunionstore destination key1 [key2] 返回给定所有集合的并集并存储在 destination 中
sdiffstore destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
smove source destination member 将 member 元素从 source 集合移动到 destination 集合

注意事项:

  • set类型不允许数据重复,若存入重复数据,会返回integer(0),报错信息
  • set虽然与hash存储结构相同,但是无法开启hash中存储值的空间

应用场景:

  • 利用set集合的数据去重的特征,记录各种访问数据
  • 建立string类型数据,利用incr统计访问量...

Tip:redis应用于同类型数据的快速去重。

 

 

sorted_set

数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式;

相当于在set的存储结构基础上添加了可排序字段;

Redis学习笔记整理(黑马程序员视频课程)_第7张图片

sorted_set类型数据的操作

基本操作:

操作命令 命令功能
zadd key score1 member [score2 menber2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
zrang key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
zrevrang key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
zrem key member [menber...] 移除有序集合中的一个或多个成员
zrangebyscore key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
zrevrangebyscore key max min [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
zremrangebyrank key start stop 移除有序集合中给定的排名区间的所有成员
zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员
zcard key 获取有序集合的成员数
zcount key min max 计算在有序集合中指定区间分数的成员数
zinterstore destination numkeys key [key ...] 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 
zunionstore destination numkeys key [key...] 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 

注意:

  • min与max用于限定搜索查询的条件
  • start与stop用于限定查询范围,作用于索引,表示开始和结束索引
  • offset于count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

 

扩展操作:

操作命令 命令功能
zrank key member 返回有序集合中指定成员的索引
zrevrank key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
zscore key member 返回有序集中,成员的分数值
zincrby key increment member 有序集合中对指定成员的分数加上增量 increment

注意事项

  • score保存的数据存储空间是64位
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时要慎重
  • sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将会被反复覆盖,保留最后一次修改的结果

 

key通用操作

key特征

key是一个字符串,通过key获取redis中保存的数据

 

key基本操作

操作命令 命令功能
del key 删除指定key
exists key 获取key是否存在,若 key 存在返回 1 ,否则返回 0 
type key 获取key的类型

key扩展操作(时效性控制)

操作命令 命令功能
expire key seconds 为给定 key 设置过期时间,以秒计。
pexpire key milliseconds 设置 key 的过期时间以毫秒计。
expireat key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
pexpireat key milliseconds-timestamp 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
ttl key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
pttl key 以毫秒为单位返回 key 的剩余的过期时间。
persist key 移除 key 的过期时间,key 将持久保持。

 

key扩展操作(查询模式)

操作命令 命令功能
keys pattern 查找所有符合给定模式( pattern)的 key 。

                  Redis学习笔记整理(黑马程序员视频课程)_第8张图片

 

key其他操作

操作命令 命令功能
rename key newkey 重命名一个key。当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回一个错误。 当 NEW_KEY_NAME 已经存在时, RENAME 命令将覆盖旧值。
renamenx key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。
sort 对所有key排序()
help @generic 其他key通用操作

 

Redis学习笔记整理(黑马程序员视频课程)_第9张图片

 

数据库通用操作

在redis中,key是由程序员定义的,伴随着操作数据量的增加,会出现大量数据以及对应的key,数据不区分种类,类别混杂在一起,极容易出现重复或冲突

解决办法

  • redis为每个服务提供有16个数据库,编号从0到15
  • 每个数据库之间的数据相互独立

db相关操作

操作命令 命令功能
select index 切换数据库
quit 退出
ping 测试数据库连通性
echo message 打印信息
move key db 移动数据到某一个数据库

dbsize

flushdb

flushall

数据清除

 

 

 

Jedis简介

客户端连接redis

  • 连接redis
Jedis jedis = new Jedis("localhost",6379);

 

  • 操作redis
jedis.set("name","Ben");
jedis.get("name");
  • 关闭redis连接
jedis.close();

 

基于连接池获取连接

  • JedisPool:Jedis提供的连接池技术

poolConfig:连接池配置对象

host:redis服务地址

port:redis服务端口号

public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port) {
    this(poolConfig, host, port, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null);
  }
public class JedisUtils {
	public static Jedis getJedis() {

		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxTotal(30);//最大连接数
		config.setMaxIdle(10);//活动连接数
		
		JedisPool jp = new JedisPool(config,"127.0.0.2",6379);
		return jp.getResource();
	}
	public static void main(String[] args) {
		Jedis jedis = JedisUtils.getJedis();
		jedis.set("name","hello");
		String name = jedis.get("name");
    	System.out.println(name);
    	//3,。关闭连接
    	jedis.close();
	}
}

 

你可能感兴趣的:(Redis学习笔记整理(黑马程序员视频课程))