redis是一个键值对类型的NoSql类型的数据库。
NoSql(Non-relational SQL的缩写,也有人看作是not only sql的缩写)型数据库,具有以下特征:
1、非结构化:几乎没有约束,约束很少,这要看是什么数据库,没有对字段的像primary key、not null等等的约束。
2、无关联的:没有表与表之间的外键关系,采用json格式存储,数据库本身不会维护表与表之间表与表之间的关系,需要程序员自己来完成。
3、非sql:不同数据库操作数据采用的不同的语法格式,不像sql型数据库公用一套操纵数据库的语法。
4、不满足ACID(原子性,持久性,隔离性,一致性)
5、数据存储在内存中(sql的存储在磁盘中)
6、数据不安全,性能高。
NoSql类型数据有4种:1、键值对类型,代表:redis;2、文档类型,代表:MongoDB;3、列类型,代表:HBase;4、Graph类型,代表:Neo4j
下面让我们来简单了解一下redis
redis,全称:Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型数据库。
特征:
键值型:key一般是String类型,value支持多种不同数据结构,比如String,hash,set,list等等。
单线程:每个命令具备原子性(redis6.0后的版本所具备的多线程说的是对网络请求可以有多个线程)。
低延迟,速度快:基于内存、IO多路复用、良好的编码。只要是因为存储在内存中。
支持数据持久化
支持主从集群、分片集群
支持多语言客户端
redis的下载需要在Lunix系统中下载。我的电脑为macOS
下载完后,我们可以通过修改redis.conf配置文件来修改一下配置。该配置文件的目录为usr/local/etc/ 然后打开其中的redis.conf文件。下面是几个基础配置
bind 0.0.0.0 配置 ,用于配置访问redis的IP地址,默认是127.0.0.1 。配置0.0.0.0就是所以IP都可以访问,如果redis中存储了重要信息,就不要设置成0.0.0.0
port 6379,配置redis的端口号,默认是6379
daemonize yes ,配置的redis的守护进程,配置为yes就可后台运行
logfile "redis.log" ,配置redis运行日志的存储位置,字符串中的就是日志文件的路径,默认为空,即不存储日志。如果像我这样不写路径,只写个文件名,就是默认在运行redis的当前目录创建该日志文件进行存储。
databases 16 ,配置redis中数据库的数量,redis中数据库的数量是指定的(当然,可以随时在配置文件中修改),不像mysql数据库,可以直接创建任意数量的database。默认为16,编号为0~15。
requirepass xxxxx ,配置登陆redis的密码
启动redis命令 redis-server ,默认IP为127.0.0.1,端口号为6379;也可以指定IP和端口号 redis-server -h IP地址 -p 端口号 -a 密码。
也可以基于配置文件进行启动,前面说过redis.conf配置文件在usr/local/etc目录中,首先进入该目录,在该目录运行该命令:redis-server redis.conf
要能实现数据库的CRUD(增删改查),需要用到redis的客户端,包括:命令行客户端;图形化桌面客户端;编程客户端。
命令行客户端:redis安装完成后自带命令后客户端 redis-cli 。
使用方式: redis-cli [options] [commands] 常见的options有 -h 127.0.0.1 指定redis连接的IP地址, -p 6379 指定redis连接的端口号, -a xxxx.. 指定redis连接的密码。
其中commands就像redis的操作命令,不指定command就进入redis-cli的交互控制台
下面来演示一下:
我们可以 redis-cli 命令直接进入交互控制台,但此时客户端的权限大多被限制,需要我们用密码登陆一下,密码登陆命令 AUTH 你的密码
redis数据结构:key一般是string类型,value类型多种多样,支持:string,hash,list,set,sortedSet(这5个为基本类型),GEO,BiteMap,HyperLog(后三个为特殊类型)
下面介绍一下redis的基础常用命令(所以数据类型都可以用):
key pattren 返回key包括pattern的所有key(模糊查询)。
keys * 查询所有key。 key a* 查询key以a开头的key。不建议在生产环境上使用,因为当存储数据很多时,redis单线程运行,很容易堵塞。
del keys(可以只删一个,也可以删多个) 返回成功删除的key的数量。
MSET a1 b1 a2 b2 a3 b3 添加多个键值对,键值对为(a1,b1),(a2,b2),(a3,b3)。
exists key 判断该key shift存在
expire key seconds 给该key设置一个有效期,到期时该key自动删除。
TTL key 查看该key的有效期。-1 为永久有效;-2 为已失效。
value类型介绍:
string类型:是redis中最简单的存储类型,根据字段串格式不同又分为三类:string普通字符串,int整型 可自增自减,float浮点类型 可自增自减。不过底层都是字节数组形式存储。字符串类型最大存储空间不超过512m
命令:set key value 添加一个新键值对或修改一个已有键值对
get key 根据key获取value
MGET key1 key2 key3 ... 根据多个key获取多个value值。
incrby key 数字 :让一个整型key的value值自增指定步长(前面中的数字)
incrbyfloat 让一个浮点类型key的value值自增指定步长(前面中的数字)
setnx key value 添加一个string 类型键值对,前提是该key不存在,否则不执行
setex key seconds value 添加一个string键值对,并指定有效期
redis的key运行有目录关系形成层次结构,多个目录之间用:隔开。
hash类型:也叫散列,其value是一个无序字典,类似于hashMap,在存储对象时,string结构时将对象序列化为json字符串存储,很不方便修改其中的某个字段。 hash结构可以将对象中的每个字段独立存储,可以针对单个字段做crud
常用命令:
list类型:
redis中的list类型与JAVA的linkedlist类似,可以看做一个双向列表。即可以支持正向检索也可以支持反检索。 特征:有序、元素可重复、插入和删除快、查询速度一般
set类型:
redis的set结构与JAVA中的hashSet类似,可以看作一个value为Null的hashMap。特征:无序,元素不可重复,查找快,支持交集、并集、差集等功能
常见命令:
sortedSet类型:
是一个可排序的set集合,功能上与JAVA中的treeSet有些类似,但底层数据结构却差别很大。sortedSet中的每一个元素都带有score属性,可以基于score属性对元素排序,底层的实现是一个跳表(skipList)加hash表。 特征:可排序;元素不可重复;查询速度快。经常被用于实现排行榜
常见命令:
注意:所以排名默认都是升序,如果要降序则在命令首字母Z后面添加REV即可。
我们也可以在命令行客户端用help命令查看相应的命令:
输入完 help @后 ,直接按tab键,就会自动填充数据类型,每次按tab键都会换一个数据类型