Redis 端口号:6379
1】前端启动 -- 无法进行集群部署
①进入redis目录,/usr/local/redis
②./bin/redis-server
③再开一个终端窗口,到redis目录下 /usr/local/redis
④输入 ./bin/redis-cli,启动客户端即可
注:当redis部署在其他服务器上或者端口号不是6379时,
需要安装以下格式输入:./bin/redis-cli -h 127.0.0.1 -p 6379
密码登录:./bin/redis-cli -h 127.0.0.1 -p 6379 -a root
2】后端启动
①修改配置文件 daemonize no 改为 daemonize yes
若想要外部连接,先把配置文件中的 bind 127.0.0.1 注释掉
关闭保护模式 protected-mode yes 改为 protected-mode no
或者
开启密码登录 # requirepass foobared 改为 requirepass 你的密码
②输入:./bin/redis-server ./redis.conf 回车即启动
③输入:ps -ef|grep -i redis 查看redis相关进程
④集群版打开客户端:./redis01/redis-cli -h 127.0.0.1 -p 7001 -c
3】redis关闭
①kill -9 pid(进程ID) --非正常关闭,不推荐
②./bin/redis-cli shutdown --正常关闭方式
4】开放redis端口
--通过设置Linux的防火墙,开启6379端口,这个实在Linux命令下执行
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
--重新刷新防火墙
/etc/rc.d/init.d/iptables save
--或者关闭防火墙
service iptables close
5】数据类型
①redis使用的是键值对 保存数据 。 (Java中的map集合)
key : 全部都是字符串
value : 五种数据类型
Ⅰ、字符串(String) 例:"小明,小红是好朋友"
Ⅱ、Hash 例:{username:"张三",age:"18"} 类似于json,可以存储javabean
Ⅲ、List 例:[1,2,3,4,5,6] 类似于Java中的LinkedList 链表 添加/删除效率极高
Ⅳ、Set 例:['a','b','c','d'] 类似于Java中的HashSet
Ⅴ、有序的set集合(SortedSet) 例:[5000 'a', 1000 'b', 10 'c']
②key名:自定义
key名不要过长,否则影响使用效率。因为在redis中,名字越长,搜索越靠后
key名不要太短,最好是有意义的,见名知意。
③String命令:字符串类型是Redis中最为基础、常用的数据存储类型,字符串在Redis中是二进制安全的,
这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可容纳的数据长度是512M
与MySQL对比:
Redis 二进制安全(服务器端只传递二进制数据,不进行编解码) 数据不安全
MySQL 二进制不安全(服务器端传递二进制数据时编解码容易出乱码) 数据安全
Ⅰ、赋值操作
set key value 例: set username lisi
如果key值存在,value值进行覆盖,和Java的Map一致
Ⅱ、取值操作
get key 例:get username
如果key值不存在,返回一个 (nil)
Ⅲ、删除操作
del key 例:del username
存在返回值,是数字类型,表示删了几条数据。如果没有key返回0
Ⅳ、扩展
getset key value : 先获取该key的值,然后再再设置该key的值
incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后,其值为1。
如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,
相当于Java中的 ++i 。可以用作计数器
decr key: 将指定的key的value原子性的递减1,其初始值为0,在decr之后其值为-1。
如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,
相当于Java中的 --i 。
incrby key increnment: 递增 increnment 例:incrby key 10 在当前key值上加10
decrby key increnment: 递减 increnment 例:decrby key 10 在当前key值上减10
incr 和 decr 只能针对数字进行操作,对字符串不可以
append key value:拼凑字符串。如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value。
Ⅵ、使用环境
主要用于保存json格式的字符串
④hash命令
Rides中的Hash类型可以看成具有String Key和String Value的map容器,所以该类型非常适合于存储键值对象的信息。如Username、Password和Age等。
如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
Hash特点:占用磁盘空间极少
Ⅰ、赋值操作
hset key field value 为指定的key设定field/value 对(键值对) 例:hset hash1 uname zhangsan
hmset key field value [field2 value2 ... ] 设置key中的多个field/value 例:hmset hash2 uname zhangsan age 18 sex man
Ⅱ、取值操作
hget key field 返回指定的key中的field的值
hmget key filed1 field2 ... 获取key中的多个field的值
hgetall key 获取key中所有的filed-value
Ⅲ、删除操作 -- 如果没有字段,整个hash都清除
hdel key field 删除指定的key的指定的字段
del key 删除整个hash
Ⅳ、扩展
hincrby key field increment 对某个key中的字段值进行增加操作(只能对value为数字的使用)
hexists key field2 查询某个字段是否存在,若返回0,则不存在
hlen key 返回此key包含多少字段
hkeys key 获得所有字段名
hvals key 获得所有value值
⑤链表List
redis中的List类似于Java中的LinkedList
使用环境:做大数据集合的增删、任务队列
Ⅰ、赋值操作
lpush key values[value1 value2 ...] 在指定的key所关联的list的头部插入所有的values,
如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。
插入成功,返回元素的个数
例:lpush list1 1 2 3 4 存放顺序是 4 3 2 1 也就是说,lpush是从左侧添加
rpush key values[value1 value2 ...] 在该list的尾部添加元素
例:rpush list1 1 2 3 4 存放顺序是 1 2 3 4 也就是说,rpush是从右侧添加
Ⅱ、取值操作
lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;
也可为负数,若为-1.则表示链表尾部的元素,-2则表示倒数第二个,依次类推...
例:查询所有元素 lrange list1 0 -1
显示某几个元素 lrange list1 1 2
Ⅲ、删除操作即弹出操作
lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;
若key存在,则返回链表的头部元素。
例:lpop list1 删除list1中的元素 4
rpop key:从尾部弹出元素
例:rpop list1 删除list1中的元素 1
当链表元素都弹出之后,list1也不再存在
del key:删除整个集合
Ⅳ、扩展
llen key:返回指定的key关联的链表中的元素数量
例:llen list1 返回 2
rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。【循环操作】
例:#添加一个list1
rpush list1 a b c d e f
#要求把list1的d元素弹出,把元素插入list2的头部
rpoplpush list1 list2
#当所有元素都从list1中弹出至list2后,查询list1提示(empty list or set)
※循环列表操作
rpoplpush list1 list1
以下为不推荐系列:
1)删除N个元素(效率不高,不推荐使用。效率不高的原因是因为先将所有元素加上索引再弹出)
lrem key count value:删除count个 值为 value 的元素,
如果count大于0,从头向尾遍历并删除count个值为value的元素,
如果count小于0,从尾向头遍历并删除count个值为value的元素。
如果count等于0,则删除链表中所有等于value的元素
例:#添加一个list3
rpush list3 a b c a b c d b e f
#删除链表中所有的a元素
lrem list3 0 a
#删除链表中两个b元素,删除顺序是从头到尾删除
lrem list3 2 b
#删除链表中两个b元素,删除顺序是从尾到头删除
lrem list3 -2 b
2)通过索引替换元素:(效率不高,同样是因为赋索引操作)
lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。
操作链表的脚标,不存在则抛出异常。
例:#添加一个list1
rpush list1 a b c d a b c a d
#想把下标为2的元素进行替换,即 c --> www
lset list1 2 www
3)在索引前/后插入元素:(效率不高,同样是因为赋索引操作)
linsert key before|after pivot value:在pivot元素前或者后插入value元素
例:#想在下标为2的元素www前,插入元素 qqq
linsert list1 before www qqq
#想在下标为2的元素www后,插入元素 ppp
linsert list1 after www ppp
⑥-1无序的集合set
与List集合不同的是,Set集合中不允许存在重复元素
在Redis操作中,涉及到两个【大数据】集合的并集、交集、差集运算,都会依赖Set集合。
Ⅰ、赋值操作
sadd key values[value1 value2 ...] :向set中添加数据,如果该key的值已有则不会重复添加
例:#向set1中添加数据
sadd set1 a b c d a
Ⅱ、取值操作
smembers key :获取set中所有的成员
sismember key member :判断参数中指定的成员是否在该set中,1表示存在,0表示不存在
或者该key本身就不存在。(无论集合中有多少元素都可以急速的返回结果)
Ⅲ、删除操作
srem key members[members1 members2 ...] :删除set中指定的成员
例:从set1集合中删除元素 b d
srem set1 b d
del key
Ⅳ、集合运算
sadd set1 a b c d
sadd set2 a b e f g
1)差集运算
sdiff key1 key2 ... :返回key1 与 key2 的差集
例:#哪些元素属于set1,但不属于set2
sdiff set1 set2
#哪些元素属于set2,但不属于set1
sdiff set2 set1
2)交集运算
sinter key1 key2 ... :返回key1 与 key2 的交集
例:#哪些元素既属于set1,又属于set2
sinter set1 set2
3)并集计算
sunion key1 key2 ... :返回key1 与 key2 的并集
例:#哪些元素属于set1或者属于set2
sunion set1 set2
Ⅴ、扩展命令
scard key :获取set中成员的数量
srandmember key:随机返回set中的一个成员
sdiffstore destination key1 key1 ... :将key1、key2相差的成员存储在destination(新的集合)上
sinterstore destination key[key...] :将返回的交集存储在destination(新的集合)上
sunionstore destination key[key...] :将返回的并集存储在destination(新的集合)上
例:将set1和set2的并集存储在set3上
sunionstore set3 set1 set2
⑥-2有序的Set集合
有序的set集合,专门用来做排行榜
Ⅰ、赋值操作
zadd key score member score2 member2 ... :将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在,则会用新的分数替换原有的分数。
返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
默认从小到大排序。
例:#向set1集合中添加三个元素
zadd set1 5000 zhangsan 3000 lisi 1000 wangwu
Ⅱ、取值操作
zscore key member:返回指定成员的值
例:从set1集合中获取zhangsan的值
zscore set1 zhangsan
zcard key:获取集合中的成员数量
zrange key start end [withscores]:(范围查询)获取集合中脚标为start-end的成员,[withscores]参数表面返回的成员包含其分数。此为从小到大排序
例:#从set1中查询所有元素
zrange set1 0 -1
#从set1中查询所有元素并带其值
zrange set1 0 -1 withscores
zrevrange key start end [withscores]:(范围查询)获取集合中脚标为start-end的成员,
[withscores]参数表面返回的成员包含其分数。此为从大到小排序
例:#从set1中查询所有元素
zrevrange set1 0 -1
#从set1中查询所有元素并带其值
zrevrange set1 0 -1 withscores
Ⅲ、删除操作
zrem key member[member ...]:移除集合中指定的成员,可以指定多个成员。
例:从set1中删除 zhangsan 和 lisi
zrem set1 zhangsan lisi
del set1
Ⅳ、扩展命令
zremrangebyrank key start stop:按照排名范围删除元素
例:删除第一个和第二个元素(按照索引方式删除)
zremrangebyrank set1 0 1
zremrangebyscore key min max:按照值范围删除元素
例:删除值在500-1500的元素
zremrangebyscore set1 500 1500
zrangebyscore key min max [withscores][limit offset count]:
返回分数在[min,max]的成员并按照分数从低到高排序。
[withscores]:显示分数;
[limit offset count]:offset,表明从脚标offset的元素开始并返回count个成员。
(分页操作)
例:zrangebyscore set1 500 1500 withscores limit 0 2
zincrby key increment member:设置指定成员的增加的值。返回值是更改后的值。
例:zincrby set1 200 zhangsan
zcount key min max:获取分数在[min,max]之间的成员个数
例:zcount set1 0 2000
zrank key member:返回成员在集合中的排名。索引(从小到大)
例:zrank set1 zhangsan
zrevrank key member:返回成员在集合的排名。索引(从大到小)
例:zrevrank set1 zhangsan
⑦Redis通用命令
Ⅰ、keys pattern:获取所有的与pattern匹配的key,返回所有与该key匹配的keys。
通配符:
* 表示任意一个或多个字符。
? 表示任意一个字符。
例:#查询所有的key
keys *
#匹配key长度是4位的key名
keys ????
#匹配key名中包含name的key
keys *set*
Ⅱ、del key1 key2 ...:删除指定的key
Ⅲ、exists key:判断该key是否存在,1代表存在,0代表不存在
Ⅳ、rename key newkey:为当前的key重命名(不常用)
Ⅴ、设置key有效/过期的操作
1)expire key:设置过期时间,单位:秒
例:#设置list1生存时间,从永久变为30秒,过期后删除
expire list1 30
2)ttl key:获取该key所剩的超时时间,如果没有设置超时,返回-1。
如果返回-2表示超时不存在(即key已经到期)。
例:#查询list1的剩余时间
ttl list1
Ⅵ、type key:获取指定key的值类型。该命令将以字符串的格式返回。
返回的字符串为string、list、set、hash和zset,如果key不存在返回none。
Ⅶ、扩展知识-消息订阅与发布
多用于订阅新闻、新闻发布
1)消息订阅
subscribe channel:订阅频道
例:subscribe my1 订阅my1这个频道
2)消息发布
publish channel content:在指定的频道中发布消息
例:publish my1 'how do you do?'
3)批量订阅频道
psubscribe channel*
例:psubscribe my* 订阅以“my”开头的频道
Ⅷ、扩展知识-多数据库
Redis默认有16个数据库。0,1,2,...,15。数据库与数据库之间不可共享键值对
在Redis上所做的所有数据操作,都是默认在0号数据库上操作
1)切换数据库:
select 数据库名
例:切换到1号数据库
select 1
2)把某个键值对进行数据库移植
move key 数据库名
例:将username移植到1号数据库中
move username 1
3)清空当前数据库:flushdb (慎用)
4)清空Redis服务器数据:flushall (慎用)
Ⅸ、扩展知识-Redis批量操作-事务
MySQL事务:目的为了保证数据完整性,安全
Redis事务:目的为了进行Redis语句的批量化执行
1)事务
multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,
直到执行EXEC时,这些命令才会被原子的执行,类似于关系型数据库中的:begin transaction
exec:提交事务,类似于关系型数据库中的:commit --执行批量化操作
discard:事务回滚,类似于关系型数据库中的:rollback --不执行批量化操作
Ⅹ、扩展知识-Redis了解命令
1)测试命令
ping 测试连接是否存在,返回pong即存在
2)echo message (几乎无用),返回message
3)切换数据库
select db 切换到某一个数据库
4)退出连接
quit 退出客户端,相当于CTRL+C
5)数据库中key的数目
dbsize 返回当前数据库中key的数目
6)查看Redis的信息
info 查看Redis的具体信息
⑧Redis持久化
关系型数据库MySQL持久化
任何增删改语句,都是在硬盘上做的操作,断电以后,硬盘上数据还存在
非关系型数据库Redis
默认情况下,所有的增删改操作,数据都是在内存中进行。断电以后,内存中的数据不存在。
断电以后,redis的部分数据会丢失,丢失的数据时保存在内存中的数据。可见,Redis是存在持久化操作的
Redis持久化-两种策略
1)RDB: 是Redis默认的持久化操作
在Redis目录中有个dump.rdb文件,其相当于照快照,保存的是一种状态。
20GB数据--相当于-->几kb快照
优点:1】快照保存数据速度极快,还原数据速度也极快
2】适用于灾难备份,如发生灾难,将dump.rdb拷走即可
缺点:1】RDB机制符合要求就会照快照(随时随地启动),会占用一部分系统资源(突然占用),
不适合小内存机器的使用。很可能内存不足,直接宕机(服务器关闭非正常关闭)
2】只适用于内存充裕的计算机
Ⅰ、RDB何时进行照快照
服务器正常关闭时,照快照
key满足以下三个条件之一时,照快照
save 900 1 #每900秒(15分钟)至少有1个key发生变化,则dump内存快照
save 300 10 #每300秒(5分钟)至少有10个key发生变化,则dump内存快照
save 60 10000 #每60秒(5分钟)至少有10000个key发生变化,则dump内存快照
key发生变化(key数据的添加、修改、删除)
例1:12:00-12:15,有1个key发生变化,在12:15就照一次快照保存
12:00-12:15,没有任何key发生变化,在12:15就不会快照保存
例2:12:00-12:05,有11个key发生变化,在12:05就照一次快照保存
12:00-12:15,有9个key发生变化,在12:05就不会快照保存,但是在12:15会照快照
例3:12:00-12:01,有15000个key发生变化,在12:01就照一次快照保存
12:00-12:01,有1000个key发生变化,在12:01就不会快照保存,但是12:05会照快照
2)AOF:使用日志功能保存数据的操作--内存比较小的计算机
默认是AOF机制是关闭的。其有三种配置方式:
Ⅰ、每秒同步(默认)--安全性低,比较节省系统资源
每秒进行一次AOF保存数据
Ⅱ、每修改同步--比较安全,但是极为浪费效率
只要有key变化(key数据的添加、修改、删除)语句,就进行AOF保存数据
Ⅲ、不同步--不安全
不进行任何持久化操作
Ⅳ、AOF操作:
只会保存导致key变化的语句
Ⅴ、AOF配置:
everysec #每秒钟同步一次,该策略为AOF的缺省策略
always #每次有数据修改发生时,都会写入AOF文件
no #从不同步。高效但是数据不会被持久化
Ⅵ、开启AOF机制
1】打开redis.conf文件,修改 appendonly no 为 appendonly yes
2】再将 # appendfsync always
appendfsync everysec
# appendfsync no
改为
appendfsync always
# appendfsync everysec
# appendfsync no
3】关闭客户端,删除dump.rdb文件
4】重启redis服务,会多出一个 appendonly.aof 文件
Ⅶ、优缺点
1】优点:
1)、持续性占用极少量的内存资源
2】缺点:
1)、日志文件会特别大,不适用于灾难恢复
2)、恢复效率远远低于RDB