什么是Redis
Redis是用C语言开发的一个开源的高性能键值对数据库,它通过提供多种键值数据类型来适应不同场景下的存储需求
支持的数据类型:
- 字符串类型(String)
- 散列类型(hashMap )
- 列表类型(list)
- 集合类型(set)
- 有序集合类型(sortset)
开启Redis
- 前端方式
./redis-server - 后端方式
./redis-server redis.conf
- 前端方式
关闭Redis
- 直接关闭进程
ps -ef | grep redis
查找到和Redis相关的进程
kill -9 pid - 正常关闭
./redis-cli shutdown
- 直接关闭进程
Redis对外网端口开放
查看对外开放的端口状态
查看已经开放的端口状态 netstat -anp
查询指定端口是否开放
firewall-cmd --query-port=6379/tcp
注意:yes 表示开启 no 表示未开启
查看防火墙状态
systemctl status firewalld
开启防火墙:
systemctl start firewalld
关闭防火墙:
systemctl stop firewalld
开发服务
service firewalld start
对外开放端口
添加端口
firewall-cmd --add-port=6379/tcp --permanent
Redis数据结构
介绍
- redis是一种高级的key-value存储系统,其中value支持五种数据类型
- 字符串(String)
- 哈希(hash)
- 字符串列表(list)
- 字符串集合(set)
- 有序字符串集合(Sorted set)通过权重排序
- 关于key的定义
赋值
set key value
set username 张三
取值
1.get key
eg: get username
2.getset key value 先获取该key的值,然后再设置该key的值
eg: getset name loong
删除
del key 删除指定key
数值增减(数字)
- incr
类似于i++
- decr
类似于i--
- incrby key increment
将指定的key 的value原子性增加increment
eg: incrby num 5
- decrby key decrement
将指定的key 的value原子性减少decrement
eg: decrby num 3
- append key value
拼凑字符串,追加value
eg: append username xxx
存储hash
具有String key 和 String value的map容器,适合存储值对象
每一个Hash可以存储4294967295个键值对
赋值
- hset key field value
为指定的key设定field/value对
eg: hset myhash username jackhset myhash age 18
- hmset key field value (field2 value2 …)
设置key中的多个field/value
eg: hmset myhash2 username rose age 21
取值
- hget key field
返回指定的key中的field的值
eg: hget myhash username - hmget key field (field2)
返回指定的key中的多个field的值
eg: hmget myhash name age addr
-hgetall key
取出key所有的filed -value
eg: hgetall myhash
删除
- hdel key field (field2)
删除hash中的某一个属性
eg: hdel myhash age - hdelall key
删除所有内容 - del key
删除整个key
增加
incrby key field increment
其他
- hexists key field
判断指定key中的field是否存在 - hlen key
获取key所包含的field的数量 - hkeys key
获取所有的key - hvals key
获取所有的value
存储list
添加
- lpush key values [value1,value2…]
在指定key所关联的list的头部插入所有的values
头部插入数据,插入成功,返回元素的个数 - rpush key values[value1,value2 ]
在该list的尾部添加元素
rpush mylist a b c d取值
- lrange key start end
获取链表中从start 到end的元素的值
start ,end从0 开始计数,也可以为负数
若为-1则表示链表尾部的元素
eg: lrange mylist 0 5
两端弹出
- lpop key
返回并弹出指定的key关联的链表中的第一个元素(头部元素)
如果不存在 ,返回nil ,如果key存在,则返回链表的头部元素
lpop mylist - rpop key
从尾部弹出元素
eg: rpop mylist获取列表的元素的个数
- llen key
返回指定的key关联的链表中的元素的数量
eg: llen mylist
扩展命令
- lpushx key value
仅当参数中指定的key存在时,向关联的list的头部插入value
如果不存在,将不进行插入 - rpushx key value
在该list的尾部添加元素 - lrem key count value
删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素
如果count 小于0 则从尾向头遍历并删除,如果count等于0,则删除链表中所有等于value的元素
eg : lrem mylist 2 3 从头删除,2个数字3 - lset key index value
设置链表中的index的角标的元素值,0代表链表的头元素,-1代表链表的为元素操作链表的角标不存在则会抛出异常,相当于替换
eg: lset mylist 3 444 - linsert key before|after pivot value
在pivot元素前或者元素后面插入value这个元素
eg : linsert mylist after a yyy - rpoplpush resource destination
将链表中的为尾部元素弹出并添加到头部元素(循环操作)
eg: rpoplpush mylist1 mylist2
将mylist1右端弹出 ,压入到mylist2的左边
存储Set
没有排序的字符集合,和list一样,可以执行添加,删除,修改等操作
和list不同的是,`set集合中不允许出现重复的元素`
添加
- sadd key values[value1,value2…]
向set中添加数据
如果该key值已有则不会重复添加
eg: sadd myset a b c删除
- srem key membbers[member1,member2…]
删除set中指定成员
eg: srem myset 1 2获取元素
- smembers key
获取set中所有的成员 - sismember key member
判断参数中指定成员是否在该set中,1表示在,0 表示不在差集运算
- sdiff key1 key2 key3 …
返回key1和key2中相差的成员,而且与key的顺序有关,即返回差集
属于key1 并且不属于key2的元素构成的集合交集运算
sinter key1 key 2 key3 …
返回交集
属于key1并且属于key2的元素构成的集合
eg: sinter myset1 myset2并集运算
sunion key1 key2 key3 …
返回并集
属于key1或者属于key2的元素构成的集合
扩展命令
- scard key
获取set中成员的数量
eg: scard myset - srandmember key
随机返回一个set中的成员
eg:srandmember myset - sdiffstore destination key1 key2 key3…
将key1 ,key2相差的成员存储在destination上
eg: sdiffstore myset myset1 myset2 - sinterstore destination key[key…]
将返回的交集存储在destination上 - sunionstore destination key[key…]
将返回的并集存储在destination上
存储sorted set
sorted set 和set 类型极为相似,都是字符串集合,都不允许重复的成员出现在一个setzhogn 他们之间的主要差别是sorted set中的每一个成员都会有一个分数与之关联,redis正是通过分数来为集合中的成员进行从小到大的顺序,同时分数是可以重复的
常用命令
- 新增元素
zadd key score number - 获得元素
zscore key mumber
返回指定成员的分数 - 删除元素
- zrem key member[member…]
移除集合中指定成员 可以指定多个成员 - zremrangebyrank key start stop
按照排名范围删除元素
- zrem key member[member…]
范围查询
- zrange key start end [withscores];
获得集合中角标为start - end 的成员
[widthscores]:代表返回成员包含的分数 - zrevrange key start end [withscores];
按照scores从大到小的顺序返回索引从start到stop之间的所有元素
- zrange key start end [withscores];
获得成员数量
zcard -key- 设置指定成员增加的分数,返回值为跟更新后的分数
zincrby key increment member - 获取分数在[min,max]之间的成员个数
zcount key min max - 返回成员在集合中的排名(从小到大)
zrank key member - 返回成员在集合中的排名(从大到小)
zrevrank key member
Keys通用操作
keys pattern
获取所有与pattern匹配的key,返回所有与该key匹配的keys。
*代表任意一个或多个字符
? 代表任意一个字符
del key1 key2 …
删除指定的key
可以一次删除多个
exists key
判断该key 是否存在
1 代表存在
0 代表不存在
rename key newkey
为当前的key重命名
expire key 过期时间
设置过期时间
单位:秒s
ttl key
获取该key所剩的超时时间
如果没有设置超时 返回-1
如果返回-2 表示超时不存在
type key
获取指定key的类型
该命令将以字符串的格式返回
返回的字符串为String,list,set,hash和zset
如果key不存在返回none
Redis 特性
多数据库
一个redis可以提供16个数据库
下标从0 到15
客户端可以指定连接某个redis实例的哪个数据库
客户端默认连接0号数据库
也可以通过select选择连接哪个数据库
eg: select 1 选择1号数据库
- 将newkey移植到1号库
move newkey 1;
将当前库的key移植到1号库中
服务器命令
- ping
测试连接是否存活 - echo
在命令行打印一些内容
echo loong - select
选择数据库
redis数据库编号从0~15
可以选择任意一个数据库来进行数据的存取 - quit
退出连接 - dbsize
返回当前数据库中key的数目 - info
获取服务器的信息和统计 - flushdb
删除当前选择数据库中的所有key - flushall
删除所有数据库中的所有key
消息订阅与发布
- 订阅频道
subscribe channel - 批量订阅频道
psubscribe channel;
例: psubscribe s
订阅以‘s’开头的频道 - 发布消息
publish channel content
在指定的频道中发布消息
例: publish mychat ‘today is good day’reis事务
- mutil
开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行exec时,这些命令才会被原子执行 - exec
提交事务 ,类似于关系型数据库中的:commit - discard
事务回滚,类似于关系数据库中的rollback
redis持久化
redis的高性能是由于其将所有数据都存储在了内存中,为了使redis在重启之后任能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化
持久化方式
RDB方式(redis databases)
默认支持,无需配置
在指定时间间隔内将内存中的数据集快照写入到磁盘
Snapshot快照 ,它恢复时是将快照文件直接读到内存中
如果需要进行大规模数据的恢复,并且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加的高效
RDB的缺点
最后一次持久化后的数据可能丢失
fork的时候内存中需要保存两份数据
- Rdb保存的是dump.rdb