Redis探索

非关系性数据库Redis入门

前言

Redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库,它的特点是高速、去硬盘化,是专门用于存储临时数据一个数据库。

NOSQL

NOSQL是对所有非关系型数据库的通称,非关系型数据库除了Redis之外,常见的还有MongoDB、CouchDB、memcached等等。

非关系性数据库的优点

  • 高性能;非关系型的数据库,仅存储键值,执行查询等操作的时候不用像关系型数据库一样去解析SQL,性能非常高。可以换个方式理解,关系型的数据库里面所有的表都是两列,而且有一列是主键,这样的数据库查询是非常快的。
  • 易拓展;由于是键值型的存储,数据之间没有耦合性和关联性所以非常容易水平扩展。
  • 简单免费;nosql数据库基本上都是开源软件,这为软件公司减少了很多成本,而且安装过程简单易行;
  • 格式丰富;可以存储图片,文档等等;

非关系性数据库的缺点

1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
3)不提供关系型数据库对事务的处理。

Redis安装

安装包下载地址:https://github.com/tporadowski/redis/releases
下载最新版本
在这里插入图片描述

下载之后双击安装
在这里插入图片描述

基本上默认安装,端口这里特别注意一下端口号
在这里插入图片描述

安装本身而言并不难
在这里插入图片描述
安装完成之后打开服务,可以看到做在运行的服务
在这里插入图片描述

安装目录下有客户端工具
在这里插入图片描述

数据结构

redis是基于键值key:value存储的,其中value支持五种数据类型:字符串(strings)、字符串列表(lists)、字符串集合(sets)、有序字符串集合(sorted sets)、哈希(hashes);

String

strings类型是一个很基础的数据类型,基本上无论是关系型数据库还是非关系型数据库都支持,是任何存储系统都必备的数据类型。
我们做一个简单的实际操作:打开Redis安装目录下的redis-cli.exe,先输入set mystr “hello world!”,然后再输入get mystr;这样就完成了一个string类型数据的存储和读取
在这里插入图片描述

字符串类型的数据读写非常简单。
这里可能大家会有一个疑问,数值能不能存储?
答案是可以的,而且Redis会自动转化数值。创建的方法和上文中提到的一样。
我们接下来演示操作数据常用的几个命令
首先通过Set mynum 2指令创建一个mynum的值,然后入以下操作
在这里插入图片描述

INCR(增加1)、INCRBY(按照参数增值)、DECR(减1)、DECRBY(按照参数值减值)
5.2lists
注意,这个是链表而不是列表,也不是数组;链表的特点是头尾插入元素的效率很快,不论这个lists里面包含的多少元素,10个也好千万个也好,速度是一样的。
lists的常用操作:
LPUSH:在数组左侧插入一个元素;
RPUSH:在数组右侧插入一个元素;
LRANGE:指定一个范围,获取里面的元素;
我们下面来实际操作一番:
lpush mylist “1” 创建一个链表mylist,并插入一个1
lpush mylist “1” “2”再插入两个元素,注意,这里用空格键隔开
在这里插入图片描述

这样就插入了三个元素,rpush的方法和这个类似
在这里插入图片描述

我们用lrange从数组中获取元素
lrange mylist 0 1
从编号0到倒数第二个元素
lrange mylist 0 -2
在这里插入图片描述

集合

redis的集合特征是无序,也就是说里面的元素是不分先后的。这里简单介绍一下用法;
创建添加新元素
sadd newset “one”
在这里插入图片描述

列出集合中的所有元素
smembers newset
在这里插入图片描述

删除元素
srem newset one
在这里插入图片描述

求并集
sunion newset newset2
在这里插入图片描述

其交集
sinter newset newset2
在这里插入图片描述

有序集合

redis不仅有无序集合(sets),还有有序集合(sorted sets)。有序集合的指令比较有特点,在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等,所以有序集合又叫zset;
Zset命令实例:增加序号为1的A元素
zadd myzset 1 A
在这里插入图片描述

乱序增加DCB元素,然后列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
zrange myzset 0 -1
在这里插入图片描述

哈希

Redis的哈希存的是字符串和字符串值之间的映射,这个是redis-2.0.0版本之后才有的。
建立哈希值,我们以用户信息为例:
HMSET user:001 username nebula password 123456 age 100
在这里插入图片描述

输出哈希的内容

HGETALL user:001
在这里插入图片描述

更改其中的某一个值

HSET user:001 age 200
再次输出哈希的内容
HGETALL user:001
在这里插入图片描述

以上是有关hashes的基本操作。

持久化

redis主要有两种持久化的方式,分别是RDB和AOF。
6.1RDB
即Redis DataBase,是将redis某一时刻的数据持久化到磁盘中,是一种快照式snapshotting的持久化方法。
可以调用save或者bgsave命令,同步或异步执行rdb快照生成。
配置文件中save可以设置多个,就是多个snapshotting检查点。
在这里插入图片描述

RDB的持久化方式是一种文件覆盖的方法,每隔一段时间,它会单独发起一个子进程来进行持久化,这个持久化完成了之后才会替换之前的持久化文件,这种特性可以实现随时备份和复用,另起一个进程的方法确保了redis的高性能。
RDB在数据量较大的情况下比较适用,要比AOF方式更加的高效。
RDB也有它的缺点。如果你对数据的完整性非常敏感,对每一份数据都要求不能缺失,那么RDB方式就不太适合你,比如每1分钟都持久化一次,当redis故障或者电脑关机,仍然会有小于1分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。

AOF

是Append Only File的简写,这是只允许追加不允许更改的文件,这种方式类似数据库的脚本升级方式,将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
我们通过配置redis.conf中的appendonly yes就可以打开AOF功能。如果有写操作(如SET等),redis就会被追加到AOF文件的末尾。
在这里插入图片描述
在这里插入图片描述

大家可以看到,redis配置文件非常庞大,但是大部分都是说明文档。
AOF默认每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中)。如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。
这种方式会导致一个问题,大家知道文件内容一直增加会导致文件过大,但是AOF又一套机制可以解决这个问题,那就是重写(rewrite),当日志过大的时候,它会重新整理日志,优化成最小。
打个比方,比如数据库脚本,每次升级都会加几个脚本,久而久之脚本会越来越多,这些脚本大多都是加字段,改字段,删数据删字段等等,其实吧这些脚本合并起来,就可以较少命令数,把增加改字段和数据的操作统一合并到原有的建表脚本里,就可以最大化优化代码;
AOF方式缺陷:在同样数据规模的情况下,AOF文件要比RDB文件的体积大。而且,AOF方式的恢复速度也要慢于RDB方式。
执行BGREWRITEAOF,这个是AOF的重写命令,redis会生成一个全新的AOF文件,将之前的日志全部简化整合。
AOF文件如下
在这里插入图片描述

代码如下
在这里插入图片描述

选择RDB和AOF

对于选择RDB还是AOF,官方的建议是两个同时使用。
前文有提到过,对数据敏感的用AOF,不敏感的用RDB,其实二者。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。

redis的事务处理

关于事务,有接触过关系型数据库的程序员都知道,类似Oracle这样的数据库都会有事务机制,可以提交批量的数据库脚本或者全部撤销回滚;
Redis也有事务机制,先介绍四个redis指令,即MULTI、EXEC、DISCARD、WATCH。这四个指令构成了redis事务处理的基础。
1.MULTI:生成事务;
2.EXEC:执行事务;
3.DISCARD:取消事务;
4.WATCH:锁,用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
看看下面的实例
设置一个叫a的key 初始值为3
set a 3
给a加1
Incr a
测试与服务器的链接
Ping
最后执行本项事务
Exec
大家可以看到结果,如下图所示:
在这里插入图片描述

在multi事务模式下,每添加一个指令都会回复QUEUED,这代表指令已经添加到了缓存的命令队列中,在最后执行exec指令的时候,会把缓存的所有指令队列作为一个整体事务执行。
接下来我们测试一下它的事务性:
我们知道事务的概念意义,执行一系列的、批量的指令,如果其中某个指令出错则全部无效。那么redis也是这样吗?我们接下来看下例子
Multi
Wahahah
Ping
Exec
在这里插入图片描述

这种情况,全部的指令都不生效,大家可以在最后的提示就可以看出来。
这是代码级别的错误,什么意思,意思就是指令中的代码,本身就有问题,这时候是不执行事务中的所有指令。
代码错误,即编译错误,不执行事务;
再看另一个例子
multi
Set a 33
Sadd a 99
Incr a
exec
在这里插入图片描述

可以看到第二个指令执行失败了,是因为sadd是针对集合的,所以会失败。而看第三条,可以看到指令是执行成功了,数字a确实是增加了1。
从这里可以看到redis事务的一个特性:业务执行错误的情况下,执行所有可执行的指令,这和我们所认识的大部分关系型数据库不一致。

最后一个指令“WATCH”,顾名思义,是一个用于观察监视的指令,它的主要作用是监视key是否被改过。如果没被改过,执行事务就成功,如果被改过执行事务就会失败。
但是不管事务执行失败还是成功,这key都会被解锁。
看以下的两个例子
set a 23
watch a
set a 24
Multi
set a 25
get a
exec
在这里插入图片描述

事务执行到最后会出现nil,这个说明事务执行错误。
我们看另一个例子,吧watch之后的set a 24去掉,看看效果;
set a 23
watch a
Multi
set a 25
get a
exec
在这里插入图片描述

大家可以看到,事务执行成功。
这个就是watch的一种监视机制,在事务执行前对key进行监视和锁定。在事务执行之后,对key进行解锁。

Redis桌面工具

常见的redis桌面管理工具主要有以下几个:redis desktop manager、medis、AnotherRedisDesktopManager、fastoredis、redis-plus、red;我们这里以redisinsight和redis desktop manager为例。

Redisinsight

https://redislabs.com/redisinsight/
在这里插入图片描述
在这里插入图片描述

里面包含了许多功能,包括key的查找,数据的查询管理等等;

RedisDesktopManager

这个是一款收费的软件

在这里插入图片描述
在这里插入图片描述

Redis的管理工具的基本功能差不多,到深处各自略有偏向;

C#引用Redis

在nuget中搜索Redis,将StackExchange.Redis安装到项目;
在这里插入图片描述

然后在后台的代码如下
在这里插入图片描述

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(“192.168.42.128:6379”);
IDatabase db = redis.GetDatabase();
val.Text = db.StringGet(key.Text);
redis默认不允许远程连接。–修改redis.conf配置文件
在这里插入图片描述

常用命令表

Ping 返回pong就代表服务器正常,否则不正常
dbsize 返回当前数据库的 key 的数量。
select 5 选择第6个库;配置里面有“databases 16”代表有16个库
flushdb 删除当前库的数据
exit 或 quit 退出当前库的链接
Keys wrd 查找所有满足 wrd格式的key。没有后面的条件就是查找所有
*表示多个字符;?表示单个字符;
exists key
expire key 10 Key的生存时间10s
ttl key -1 :没有设置 key 的生存时间, key 永不过期。
-2 :key 不存在
数字:key 的剩余时间,秒为单位
type key none (key 不存在)
string (字符串)
list (列表) set (集合)
zset (有序集)
hash (哈希表)
del key 删除存在的 key ,不存在的 key 忽略。
返回值:数字,删除的 key 的数量。
append key value String类型后面追加
strlen key 返回 key 所储存的字符串值的长度返回值:
①:如果key存在,返回字符串值的长度
②:key不存在,返回0
getrange key start end 字符串截取。负数代表从后面开始计算
setrange key offset value 用 value 覆盖(替换)key 的存储的值从 offset 开始,不存在的 key 做空白字符串
mset key value 同时设置一个或多个 key-value 对
mget key 获取所有(一个或多个)给定 key 的值返回值:包含所有 key 的列表
hdel key field [field…] 删除哈希表 key 中的一个或多个指定域 field,不存在 field 直接忽略
lindex key index 获取列表 key 中下标为指定 index 的元素
llen key 获取列表 key 的长度
lrem key count value 根据参数 count 的值,移除列表中与参数 value 相等的元素
lset key index value 将列表 key 下标为 index 的元素的值设置为 value
linsert key BEFORE|ALFTER pivot value 将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key 不存在,pivot 不在列表中,不执行任何操作。
sismember key member 判断 member 元素是否是集合 key 的成员
scard key 获取集合里面的元素个数
srem key member [member…] 删除集合 key 中的一个或多个 member 元素,不存在的元素被忽略。
zrevrange key start stop [WITHSCORES] zrevrange key start stop [WITHSCORES]
zrem key member [member…] 删除有序集合 key 中的一个或多个成员,不存在的成员被忽略
zrangebyscore key min max [WITHSCORES ] [LIMIT offset count] 获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括 min 和 max)的成员,有序成员是按递增(从小到大)排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值