Redis--->是非关系型数据库(也称缓存数据库),是一种NoSQL数据库
存放5种数据类型 String key-value形式
另外list,set,zset,hash
另外两种不常用的:bitmap(位图类型),geo(地理位置类型),另外Redis5.0新增 stream类型
相对来说Redis适合存放少数据量的数据,如果需要存放大量数据到内存,推荐MongoDB,HBase.
是一个用C语言编写的开源的基于内存运行并支持持久化,高性能的NoSQL数据库.Redis种的数据大部分时间都是存储内存中,适合存储频繁访问,数据量娇小的数据.
特点:
1、支持数据持久化
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
2、支持多种数据结构
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3、支持数据备份
Redis支持数据的备份,即master-slave模式的数据备份。
Linux上安装Redis
官网:https://redis.io 选择下载相应版本
这目录不创建也行,多余
解压到该目录中 tar -zxvf redis-5.0.2.tar.gz -C /usr/local/develop/redis
进入该目录
执行命令 make 就是编译src
该命令有可能出错,出错原因可以是cc命令没找到,是C语言编译程序,好比运行java程序需要jdk里的命令一样
如果出现错误 如下操作
或者
或者直接
yum -y install gcc
以前安装过,所以都OK
如果说第一次make 因为没有安装gcc导致报错,很可能安装好gcc之后 继续执行make命令再次报错,原因是第一次编译过了,只是没法执行, 这种情况 在该目录执行清理命令 make distclea 然后再次执行make命令
继续当前目录执行make install 其实不执行该命令也可以启动Redis了,但是每次都要去Redis的bin目录,make install命令执行后,会配置到环境变量中就是local/bin环境目录里,就是你在任何目录下面都可以执行Redis命令
进入 /usr/local/bin redis的命令全配置好了 可以在任何目录启动
启动方式:
1. 前台启动 redis-server(会占用终端命令页面)
2.后台启动 redis-server &(用后台启动)
3.启动redis服务时,指定配置文件:在redis安装目录下有个redis.conf用来修改Redis配置
如果你修改了该配置文件,启动要指定该配置文件,不然配置不生效
启动命令 redis-server redis.conf &(指定配置文件并在后台启动)
如下图 可通过命令 vim redis.conf修改配置
回车一下
管道查一下
ps -ef|grep redis
关闭方式:
①使用redis客户端关闭,向服务器发出关闭命令
任意目录下执行 指令redis-cli shutdown
推荐使用这种方式, redis先完成数据操作,然后再关闭
②kill pid 或者 kill -9 pid
这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
先使用 ps -ef | grep redis 查出进程号,在使用 kill pid
Hello Redis
Redis客户端
Redis客户端是一个程序,通过网络连接到Redis服务器,从而实现跟 Redis服务器的交互。
Redis客户端发送命令,同时显示Redis服务器的处理结果。
redis-cli(Redis Command Line Interface)是Redis自带的基于命令行的Redis客户端,用于与服务端交互,我们可以使用该客户端来执行redis的各种命令。
redis的客户端:用来连接redis服务,向redis服务器发送命令,并且显示redis服务处理结果。
redis-cli:是redis自带的客户端,使用命令redis-cli就可以启动redis的客户端程序。
redis-cli:默认连接127.0.0.1(本机)的6379端口上的redis服务
redis-cli -p 端口号:连接127.0.0.1(本机)的指定端口上的redis服务 比如Redis集群指定端口号
redis-cli -h ip地址 -p 端口:连接指定ip主机上的指定端口的redis服务 比如Redis集群指定端口号
如果redis客户端有中文,使用redis-cli -h ip地址 -p 端口 --raw命令连接redis可以正常显示中文
例如:我在远端启动Redis服务
本机下载个Window版Redis里面有客户端
这样就连接上了
如果想在远端打开客户端,因已配置了redis全局环境命令
可任意目录执行
redis-cli -p 6379
这里有个报错 set的时候提示
查了下,需要将redis.conf文件修改下
........
改回yes,空了再弄
先远程启动客户端耍耍
默认情况不需要密码
可以对Redis数据库进行增删改查
退出客户端 exit 或者quit
Redis基本知识
一些基础命令
1.redis-benchmark 用来测试redis性能 模拟处理10W个请求
2.Redis沟通命令,查看状态
ping 返回PONG
解释:输入ping,redis给我们返回PONG,表示redis服务运行正常
3.查看redis服务器的统计信息:info server和info 进入redis-cli客户端输入该命令
语法:info [section]
作用:以一种易于解释且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。section 用来返回指定部分的统计信息。 section的值:server , clients ,memory等等。不加section 返回全部统计信息
返回值:指定section的统计信息或全部信息
4.redis默认使用16个库
Redis默认使用16个库,从0到15。 对数据库个数的修改,在redis.conf文件中databases 16,理论上可以配置无限多个
Redis中的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例
5.切换库命令:select db
默认使用第0个,如果要使用其他数据库,命令是 select index
6.查看当前数据库中key的数目:dbsize
Redis 0号库默认放着4个键值对
7.查看当前数据库中有哪些key:keys *
8.清空当前库:flushdb
9.清空所有数据库:flushall
10.config get * 获得redis的所有配置值
语法:config get parameter
作用:获取运行中Redis服务器的配置参数, 获取全部配置可以使用*。参数信息来自redis.conf 文件的内容。
例1:获取数据库个数 config get databases
config get port
flushall 清空所有数据库
redis英文版命令大全:Commands | Redis
redis中文版命令大全:Redis 命令参考 — Redis 命令参考
Redis常用5种数据结构
A.字符串类型 string
字符串类型是Redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数
据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M。
B.列表类型 list
Redis列表是简单的字符串列表,按照插入顺序排序,元素可以重复。你可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构。
C.集合类型 set
Redis的Set是string类型的无序无重复集合。
D.哈希类型 hash
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
E.有序集合类型 zset (sorted set)
Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。
Redis的常用操作命令
1.key的操作命令
1.1)keys的操作命令
语法:keys pattern
作用:查找所有符合模式pattern的key. pattern可以使用通配符。
通配符:
keys wo[]d
语法:exists key [key…]
作用:判断key是否存在
返回值:整数,存在key返回1,其他返回0。使用多个key,返回存在的key的数量。
语法:ttl key
作用:查看key的剩余生存时间(ttl: time to live),以秒为单位。
返回值:
1.查询数据库中的key
keys *:查看数据库所有的key
keys k*:查看数据库中所有以k开头的key
keys h*o:查看数据库中所有以h开头,以o结尾的key
keys h?o:查看数据库中所有以h开头,以o结尾的,并且中间只有一个字符的key
keys h[abc]llo:查看数据库中所有以h开头以llo结尾,并且h后边只能取abc中的一个字符的key
2.判断key在数据库中是否存在:exists key 如果存在则返回1,如果不存在则返回0
exists k1:判断k1是否存在 存在返回1 不存在返回0
exist k1 k2 k3:判断k1 k2 k3是否存在 返回值是存在的key的数量
3.move移动指定key到指定的数据库实例,原来库里的该数据删除
move k1 1:将key为k1的数据移动到1号库
4.ttl查看指定key的剩余生存时间,返回-1表示没有设置key的生存时间,永不过期.返回-2,表示key不存在,时间以秒为单位
ttl k1:查看key为k1的key的剩余生存时间
5.expire设置key的生存时间,以秒为单位,超过时间key自动删除,返回1表示设置成功,返回0表示其他情况
expire k1 20:设置key为k1的该条数据生存时间为20秒,20秒后自动删除
6.type查看key存储值的数据类型
返回值none(key不存在),String(字符串),list(列表),set(集合),zset(有序集),hash(哈希表)
7.rename key newkey.将key改名为newkey. 当key和newkey相同,或者key不存在时,返回一个错误.当newkey已经存在,将会把旧值覆盖
rename k1 k11:将key为k1的数据改名为key为k11
8.del删除存在的key,如果key不存在,忽略,返回值为删除的key的数量
del k1:删除key为k1的该条数据
del k1 k2:删除key为k1还有k2的两条数据
--------------------------------------------------------------------------------------------------------------------
有关String类型数据的操作命令,单key 单value(数值,boolean在redis中都是以字符串形式存储)
1.将String类型的数据保存到redis中:set
set zs zhangsan:设置key为zs,value为zhangsan的字符串到redis
set age 100:设置key为age,value为100的字符串到redis
set age 200:设置key为age,value为200的字符串到redis,如果key已经存在会把以前的value覆盖
2.get获取String类型的数据
get zs:获取key为zs的value值
3.append追加字符串,返回值:返回追加之后字符串长度,key如果不存在,相当于set
append age 123:将数据库原有key为age的value值,比如说200追加为200123
4.strlen获取key对应value值字符串的长度
strlen age:查看key为age对应value字符串的长度
5.incr对表示数值的字符串进行+1运算,返回+1之后的数据值,如果key不存在,首先设置一个key,value初始化为0,然后进行incr运算+1.如果value值不是数值的话,报错.value必须是数值
incr age:将key为age的value值进行+1运算
6.decr对表示数值的字符串进行-1运算,返回-1之后的数据值,如果key不存在,首先设置一个key,value初始化为0,然后进行incr运算-1.如果value值不是数值的话,报错.value必须是数值
incr age:将key为age的value值进行-1运算
7.将字符串数值进行off(偏移量)set运算: incrby key offset(加几)
incrby age 100:将key为age的value值进行+100运算,offset随意多少,100就是那个offset(偏移量).如果value值不是数值的话,报错.value必须是数值.返回加100之后的数据值
8.将字符串数值进行off(偏移量)set运算: decrby key offset(减几)
decrby age 69:将key为age的value值进行-69运算,offset随意多少,69就是那个offset(偏移量).如果value值不是数值的话,报错.value必须是数值.返回减69之后的数据值
9.获取(截取)字符串中的子字符串:getrange key startIndex endIndex.(下标从0开始),不影响原数据
getrange age 1 5:比如说age的value是1234567 那么截取到的值就是23456
getrange name 1 5:比如说age的value是zhangsang 那么截取到的值就是hangs
getrange name 1 20:比如说age的value是zhangsang 那么截取到的值就是hangsang
getrange name 1 -1:比如说age的value是zhangsang 那么截取到的值就是hangsang
getrange name 1 -2:比如说age的value是zhangsang 那么截取到的值就是hangsan
getrange name 1 -3:比如说age的value是zhangsang 那么截取到的值就是hangsa
getrange name 0 -1:比如说age的value是zhangsang 那么截取到的值就是zhangsang
10.覆盖字符串setrange key starIndex value
setrange name 1 x:比如说age的value是zhangsan 从下标1开始覆盖 覆盖的值为x,返回覆盖之后的长度 那么value就变成zxangsan
setrange name 1 xqwertyui:比如说age的value是zhangsan 从下标1开始覆盖 覆盖的值为xqwertyui,返回覆盖之后的长度 那么value就变成zxqwertyui
11.设置字符串同时什么最大生命周期setex
setex name 20 zhangsan:设置key为name,value为zhangsan,生命周期为20秒
12.设置字符串但如果key已经存在,则放弃设置,不会盲目覆盖setnx
setnx name zhangsan:设置key为name,value为zhangsan到数据库,如果key不存在,则设置,如果key不存在则放弃设置
13.批量设置数据到数据库(好比批量插入)mset key1 value1 key2 value2 key3 value3
mset name zhangsan age 20 gender 男:如果key存在,会被覆盖,中文如图
14.批量设置数据到数据库(好比批量插入)msetnx key1 value1 key2 value2 key3 value3
msetnx name zhangsan age 20 gender 男:只有当所有key都不存在,才成功,只要有一个key存在,全失败
---------------------------------------------------------------
有关List类型数据的操作命令 单key 多value 而且多个有序的value 每个value都是字符串值 下标从0开始 最后一位可以按正常从0开始的最后一位下标表示,也可以用-1表示 最后第二位-2
插入数据或者查数据都要靠下标
1.将一个或者多个值一次插入到列表.lpush key value 或者lpush key value1 value2 value3.返回插入的value个数.lpush插入key的value顺序是 value3 value2 value1
lpush phone 88588888 13998905688 999:插入key为phone value分别为999 13998905688 88588888有序列表
lpush phone 666 888:那么value值顺序为
888 666 999 13998905688 88588888
2.查看(获取)指定列表(list)中指定下标区间的元素:lrange key startIndex endIndex
lrange phone 0 1:获取key为phone的list中下标为0到下标为1的元素(含头也含尾) 返回888 666
lrange phone 0 2:获取key为phone的list中下标为0到下标为2的元素(含头也含尾) 返回888 666 999
lrange phone 1 -2:获取key为phone的list中下标为1到倒数第2个元素(含头也含尾) 返回666 999 13998905688
lrange phone 0 -1:获取key为phone的list中下标为0到最后个元素(含头也含尾) 返回888 666 999 13998905688 88588888
3.将一个或者多个值一次插入到列表.rpush key value 或者rpush key value1 value2 value3.返回插入的value个数.rpush插入key的value顺序是 value1 value2 value3
rpush list01 hehe haha deidei:插入key为phone value分别为hehe haha deidei有序列表
rpush list01 a b c:那么顺序就变成hehe haha deidei a b c
如果这里我在lpush list01 e f:那么顺序就变成e f hehe haha deidei a b c
4.lpop从指定列表中移除并且返回从左侧下标0开始开始的元素:lpop key
lpop list01:删除key为list01从左侧开始第一个元素,即下标为0的元素
5.从指定列表移除并且返回表尾元素:rpop key,返回被删元素
rpop list01:移除key为list01列表里表尾最后一个元素
6.查看获取指定列表中指定下标的元素:lindex key index
lindex list01 0:获取查看key为list01里指定下标0的元素
7.获取指定列表的长度:llen key
llen list01:获取key为list01里value的个数
8.根据count值移除(删除)列表中跟value相等的数据:lrem key count value.返回删除的个数
如果count大于0:从列表左侧开始移除count个跟value相等的数据
如果count小于0:从列表右侧开始移除count个跟value相等的数据
如果count等于0:从列表中移除所有跟value相等的数据
比如list01中的value是 a f f b c a d e a f f
那么lrem list01 2 f:表示删除key为list01从左侧开始删除2个value值为f的value,删除后a b c a d e a f f.返回删除的个数
lrem list01 -2 f:表示删除key为list01从右侧开始删除2个value值为f的value,删除后剩下a b c a d e a
lrem list01 0 a:表示删除key为list01所有value值为a的value,删除后剩下b c d e
-----------------------------------------------------------------------------------
Redis中有关set类型数据的操作命令:单key-多value(value不能重复)且无序,一个key对应多个value
因为无序,那么不用像list一样考虑左侧插入还是右侧插入,反正就是插入
Redis的Set是String类型的无需不重复集合.
1.将一个或多个元素添加到指定集合中:sadd key value或者sadd key value1 value2 value3,如果后面的value相同,以第一个为准,重复加入的不成功,返回成功加入的元素的个数
sadd set01 a b c:将a b c三个value插入到指定的key为set01的set集合,如果value重复(已存在该value)则忽略
2.获取指定集合中所有的元素:smembers key
smembers set01:返回key为set01的集合中的所有元素
3.判断指定元素在指定集合中是否存在:sismember key member,member指元素value,如果存在返回1,不存在返回0
sismember set01 f:判断key为set01的集合里是否含有元素f,存在返回1,不存在返回0
4.获取指定集合的长度即某key的集合元素的总个数:scard key
scard set01:获取key为set01的元素个数
5.移除指定集合中一个或多个元素:srem key value或者srem key value1 value2 value3,集合中不存在的元素会被忽略,返回成功移除的个数
srem set c d m:移除set01集合中value为 c d m的元素,如果该value在该集合中没有,则忽略,返回成功移除的个数
6.随机获取指定集合中的一个元素或多个元素:(抽奖) srandmember key(一个)
srandmember key count
如果count大于0,随机从该集合中获取count个元素,而且count个元素都不会重复
如果count小于0,随机从该集合中获取count个元素,但是元素可能重复,可能不重复
比如我先往集合中放些数据sadd set02 1 2 3 4 5 6 7 8 9 10
然后再srandmember set02:随机从set02中获取一个值 常用于抽奖
7.从指定集合中随机移除一个或多个元素:spop key或spop ket 1或者spop key count,,返回被移除的元素值
spop key或spop key 1都是从指定集合随机移除一个元素,返回被移除的元素值
spop key count是从指定集合随机移除多个元素,返回被移除的元素值
8.集合和集合中将指定集合中的指定元素移动到另一个集合:smove source dest member,返回移动的个数
例如现在有set01和set02
将set01中的a移动到set02去
命令:smove set01 set02 a 这样set01少了个元素a set02里多了个元素a
9.集合与集合的交集,差集,并集
9.1)求差集sdiff key key或者sdiff key key key .....获取指定第一个集合中有,但是其他集合中都没有的元素组成的新集合,返回新集合的value
9.2)获取所有指定集合中都有的新集合,求交集(大家都有的):sinter key1 key2......,返回新集合的value
9.3)获取所有指定集合中,所有元素组成的大集合,求并集:sunion key1 key2......返回新集合的value
-------------------------------------------------------------------------------------------------
Redis中有关hash类型数据的操作命令:单key value是一个对象,对象里是属性名对应属性值
field-value
field-value.......
例如:key为student value为 id-1 name-zhangsan age-20
因此要创建hash,首先取个key名,然后是file(域)对应值,file(域)对应值......
学术些讲:Redis的hash是一个String类型的key和value的映射表,这里的value是一系列的键值对,hash特别适合用于存储对象.
hash类型的数据操作总的思想是通过key和field操作value,key是数据标识,field是域,value是我们感兴趣的业务数据.
1.将一个或者多个filed-value对设置到哈希表中:hset key filed value或者
hset key field1 value1 field2 value2.......返回成功插入的field-value的对数,如果key field已经存在会覆盖掉
hset studen01 id 1001 name zhangsan age 20
2.获取指定哈希表中指定field的值:hget key field,返回该field的值
hget student01 name:获取key为student01的哈希表中,field为name的值,返回该field的值
3.hmset用法和hset key field1 value1 field2 value2.......完全一样
4.批量获取指定哈希表中多个field的值:hmget key field1 field2 field3....,返回这些field的值
5.在不知道field的情况下,获取指定哈希表中所有的field-value:hgetall key
6.从指定哈希表中删除一个或者多个field:hdel key field或者hdel key field1 filed2.....
hdel studen01 id name:删除hash表中key为studen01的 filed为id和name的field-value对
7.指定哈希表中所有的field个数:hlen key,返回值是field-value的个数
hlen studen01
8.判断指定哈希表中是否存在某一个field:hexists key field.存在返回1,不存在返回0
9.获取哈希表中某key对应的所有field:hkeys key
10.获取哈希表中某key对应的所有value:hvals key
11.如果哈希表中某key对应的某field对应的value是个数值,可以对该数值进行加法运算(int只能是整数)
hincrby key field int
hincrby studen01 age 5:哈希表中对key为studen01 field为age的value值加5,返回加之后对应的整数
12.如果哈希表中某key对应的某field对应的value是个数值,可以对该数值进行加法运算(float是浮点数)
hincrbyfloat key field float
13.针对于第一个方法(第一种设置方式其实是很危险的),hsetnx key field value或hsetnx key field1 value1 field2 value2...
也是设置,但是当key field已经存在,则放弃设置.反之则设置成功
----------------------------------------------------------------------------------------------------------
Redis有序集合zset和集合set一样也是String类型元素的集合,且不允许重复的成员.
不同的是zset的每个元素都会关联一个分数(分数可以重复),Redis通过分数来为集合中的成员进行从小到大的排序.
Redis中有关zset类型数据的操作命令:zset是有序集合,对集合里每一个value对应一个分数,然后redis根据对应分数对集合进行排序(升序)
zset集合的每一个value必须关联分数
1.将一个或者多个member及其分数值放入一个有序集合:zadd key score member.如果元素已经存在分数会被覆盖
zadd zset01 100 z1 200 z2 300 z3
2.获取指定有序集合中指定下标区间的元素:zrange key startIndex endIndex
zrange zset01 0 -1:获取所有元素
zrange zset 0 1:获取z1 z2
zrange zset 0 -1 withscores:获取所有元素和所有元素的分数
3.获取指定有序集合中指定分数区间的元素:zrangebyscore key min max
zrangebyscore set01 100 300.查出来的元素包含分数100和300的
zrangebyscore set01 100 300 withscore:把value和分数都查出来
4.指定有序集合中一个或者多个元素:zrem key member或者zrem key value1 value2.....
zrem zset01 z1 z2
5.获取指定有序集合中所有元素的个数:zcard key
zcard zset01
6.获取指定有序集合中分数在指定区间内的元素个数:zcount key min max
zcount set01 100 400
7.获取指定有序集合中指定元素的排名(排名从0开始):zrank key value
zrank zset01 z3:返回从0开始的下标
8.获取指定有序集合中指定元素的分数:zscore key value
zscore zset01 z4:返回z4的分数
9.zrevrank key value获取指定有序集合中指定元素的排名(反向排名,按照分数从大到小的排名)
返回从大到小的(最后一位下标为0)下标排名
---------------------------------------------------------------------------------------
Redis的配置文件