Redis入门
Redis
Redis简单介绍
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库
1)Redis是一个远程内存数据库,性能强劲;
2)非关系数据库(non-relational database);
3)先进的key-value持久化产品。它通常被称为数据结构服务器,它的值可以是字符串(String)、
哈希(Map)、列表(List)、集合(Sets)和有序集合(Sorted sets)等类型。
4)可以将存储在内存的键值对数据持久化到硬盘
5)用Redis容易的搭建master-slave架构用于数据复制。
Redis 命令
Redis 单机实例配置
1)redis.conf 配置文件
2)port 端口
3)requirepass
4)masterauth 主从同步在slave配置master的密码
在安装目录下执行该命令
单实例服务器端启动方式
redis-server
redis-server${redis.conf}
redis-server --port${port} 端口号
Ctrl + C 终止命令,该操作不建议,因为不执行保存操作
单实例客户端启动方式
redis-cli
redis-cli -p ${port}
redis-cli -h ${ip}
redis-cli -a${password}
redis-cli -p${port} -h${ip} -a ${password}
redis-cli shutdown (关闭6379端口,进行持久化)
redis-cli -p${port} shutdown (指定端口shutdown)
redis-cli -h${ip} shutdown (指定IP shutdown)
redis-cli -p${port} -h${ip} shutdown (指定ip和端口)
Ctrl + C 终止命令,该操作不建议,因为不执行保存操作
shutdown 操作会持久化,否则不会持久化
Redis 基础命令
info 查看系统信息
ping 确认链接。返回为Pong链接成功,否则失败。
quit 退出命令、退出client 链接
save 把数据保存到磁盘上/人工触发的对redis进行持久化
dbsize 当前Space数量
select 选择数据库
flushdb 清除当前的Keyspace
flushall 清除所有的Keyspace
clear 清除命令记录
Redis 键命令
set key value
del key
exists key 1 存在
0 不存在
expire key 10 设置key的过期时间为10秒
ttl 查看当前key的生存时间,单位是秒;
- 1 没有设置过期时间;
- 2 已经过期了;
type key 返回key的数据类型
randomkey 随机的key
rename key key2 把key命名为key2(直接去覆盖)
-nx 以nx结尾的都是比较特殊的,里边都会有一些判断的逻辑
常用操作命令
keys * 查看所有的key
keys my? 查看已my为开头的key
del my1 my2 my3 删除key
exists my1 判断key是否存在
1 存在
0 是不存在
reanme key newkey 重命名Key
expire key 1000 设置过期时间
ttl key 查询剩余的时间(相对于过期时间而言)
没有设置返回-1
type key 获得key的制定类型
常用数据结构
image.png存储字符串
key定义注意事项:
1)不要太长 不要超过1024字节,否则会降低效率;
2)也不要太短,降低可读性;
3)有一个统一的命名规范
存储String:
1)二进制操作;
2)value最大为512M;
set company banma 设置键值
get company 获取值
getset commpany baidu 先获取在设置
del commpany 删除键值
incr com 对一个数值类型的对象 递增1; 如果没有就是默认初始值0,然后加1,为1;
decr com 递减1;如果没有这个值,默认为0 减去1,为负1;
incrby num 5 num(默认值为0) 的值加5;
decrby num 5 num(默认值为0) 的值减5;
append num 5 不存在num键,创建一个num为5(字符串)的键值;在num后追加一个5的字符串,然后返回字符串的长度;
存储Hash
1)String Key 和 String Value的map容器;
2)可以存储对象
hset myhash username peijinliang 往名叫myhash的Hash中存储一个key为username,value为peijinliang
hmset myhash username rose age 12 一次设置多个键值
hget myhash username 获取myhash中键为username的value
hmget myhash username age 获取多个键值
hgetall myhash 一次获取全部属性和值
hdel myhash username 删除myhash中一个属性为username的属性和值
del myhash 删除整个hash
hincrby myhash age 5 给myhash中属性为key的值增加5
hexists myhash username 判断myhash中是否存在key为username的值
1 存在
2 不存在
hlen myhash 获取myhash中键值的个数
hkeys myhash 获取myhash中所有的属性
hvals myhash 获取myhash中所有的值
数据结构List
ArrayList 使用数组方式
LinkedList 使用双向链表
双向链表添加数据
双向链表删除数据
应用场景:完成消息队列中传递
lpush mylist a b c d 往链表mylist头部依次添加 a b c d 数据;如果没有自行创建mylist,然后添加;
返回为mylist的长度
rpush mylist 3 2 1 从链表mylist右侧(尾部)依次添加 3 2 1
lrange mylist 0 10 查询当前链表的数据
lrange mylist 0 -2 查询到右边(尾部)第二个元素(包含第二个元素);
lpop mylist 弹出左边第一个元素,弹出后列表便没有该元素;
rpop mylist 从尾部弹出第一个元素,弹出后列表便没有该元素;
llen mylist 获取链表的长度
lpushx mylist x 往链表的头部添加一个X
rpushx mylist y 往链表的尾部添加一个Y
lrem mylist 2 3 从头到尾部删除两个3
lrem mylist 0 3 删错里边所有的3
lset mylist 3 mm 在角标为3的后边设置为mm (这个表述有点问题)
lisert mylist mm before XXX 在mm之前插入XXX
lisert mylist mm after XXX 在mm之后插入XXX
rpoplpush mylist5 mylist6 把mylist5的尾部数据加入到mylist6头部(这特不太明白)
数据结构Set
与List集合不同,Set不允许出现重复数据
使用场景:
跟踪一些唯一性数据
用于维护数据对象之间的关联关系
sadd myset a b c 往myset中添加 a b c
srem myset 1 2 从myset删除 1 2
smembers myset 查看myset中的数据
sismember myset a 判断a 是否在myset中
1 表示存在
0 表示不存在
sdiff mya1 myb1 差集计算
sinter mya2 myb2 交集计算
sunion mya3 myb3 并集计算
scard myset 获取数量
srandmember myset 随机返回一个成员
sdiffstore my1 my2 my3 把my2和my3的差集存储到my1中去
sinterstore my1 my2 my3 把my2和my3的交集存储到my1中去
sunionstore my1 my2 my3 把my2和my3的并集存储到my1中去
数据结构Sorted-Set
Sorted-Set 与 Set的区别:Sorted-Set 分数。
Sorted-Set中成员在集合中的位置是有序的。
应用场景:
大型游戏的积分排行榜
微博排名和热点话题
构建索引数据
zadd mysort 60 tom 添加一个元素:分数为60, 值为tom
zadd mysort 60 black 覆盖分数为60的的值
zadd mysort 10 zs 20 ls 30 ww 添加多个元素
zscore mysort zs 获取zs的分数
zcard mysort 获取成员的数量
zrem mysort zs 删除成员 zs
zrange mysort 0 -1 查看所有成员
zrange mysort 0 -1 withscores 查看所有成员,并显示分数(正序)
zrevrange mysort 0 -1 withscores 查看所有成员,并显示分数(倒叙)
zremrangebyrank mysort 0 4 根据(位置)范围进行删除
zremrangebyscore mysort 80 100 根据(分数)范围进行删除
zrangebyscore mysort 0 100 withscores limit 0 2 根据(分数)范围查询,同时限制一下返回的位置
zincrby mysort 3 ls 给mysort中ls的分数自增3
zcount mysort 80 90 查询mysort中分数80到90之间的个数
数据结构补充
字符串:
setex key 100 value 设置key的时长是100秒,值为value
psetex key 10000 value 设置key的时长是10000毫秒,值为value
getrange key 0 2 获取key 0-2范围内的字符串
getset oldkey newvalue 设置oldkey的值为newvalue,同时返回oldkey
mset k1 v1 k2 v2 k3 v3 同时设置多个键值
mget k1 k2 k3 同时获得多个值
setnx newkey newvalue 当newkey不存在的时候,设置值为newvalue,否则设置失败
strlen key 获得字符串的长度
msetnx k1 v1 k2 v2 k3 v3 同时设置多个键值,前提是key不存在,任意一个出错,就设置失败。
该命令具有原子性;
哈希hash:
hgetall key 获取key的所有key和value
hkeys key 获取key的所有key
hvals key 获取key的所有value
hlen key 获取key的key的个数
hmget map key1 key2 获取map的key1 和 key2的值
hdel map key1 key2 删除map的key1 和 key2
hsetnx map color red 只有当map中的key不为color时可以设置成功
列表list:
lpush 最后放的一定是在最前排的/最后放的放到队伍的头部
lset list 0 100 把list的第0个元素设置为100
lpop list 移除第一个元素
rpop list 移除最后一个元素
集合set:
smembers set 查看成员value
srandmember set num 返回随机个数的(成员)值
sismember set value 查看value是否是set的成员元素
1 是
0 否
srem set kay1 key2 移除多个成员元素
spop set 移除一个随机成员元素,并且返回该元素
Reids特性
1)多数据库
一个redis最多支持16个数据库,下标分别是0-15,默认是第0个数据库。
select 数据库名 选择一个数据库
move key 数据库名 把一个key移动到另个一数据中去
2)Redis事务:所有执行语句串行执行,不在执行其他操作,保证操作的原子性。
事务的三个关键字: multi exec discard
multi (开启事务)
具体执行命令队列
exec (执行事务) / discard(回滚)
Redis 持久化
从内存中同步到硬盘中。
1)RDB方式: 默认支持,不需要配置。
在指定时间间隔内将数据写入到磁盘中去。
优势:
只包含一个文件,对于文件备份而言十分完美。
对于灾难恢复方便。
性能最大化,子进程完成数据持久化。
相对于RDB启动速度比较快。
缺点:
数据的高可用性,避免数据丢失,不是一个好的选择。(服务器宕机情况)
数据量过大,子进程操作占用资源,导致主进程卡顿。
redis.conf 配置文件(配置备份文件和路径)
save 900 1 900秒,至少有一个key发生变化
save 300 10 300秒,至少有10个key发生变化
save 60 10000 60秒,至少有10000个key发生变化
dbfilename dump.rdb 保存的文件名
dir ./ 保存的路径(当前文件夹)
2)AOF方式:将以日志的方式记录redis的操作,当服务器重启之后,他会读取该日志去构建redis数据库。
优势:
带来更高的数据安全性。
包含一个格式非常清晰,易于理解的日志文件,用于所有的修改操作。
日志为追加模式,即使宕机,也不会破坏数据,可以通过工具进行回复。
劣势:
对于相同数据文件要比RDB大一些。
根据同步策略上,运行效率上低于RDB。
redis.conf 配置文件(配置备份文件和路径)
appendonly no 需要改成yes
这个时候回产生一个文件,appendonly.aof
同步策略的设置:
appendfsync always 每修改一次就保存到磁盘上
appendfsync everysec 一秒钟写一次
appendfsync no 不同步
3)无持久化:通过配置禁用持久化功能
4)同时使用RDB和AOF方式
Java项目使用Jedis实现缓存
[https://github.com/xetorthio/jedis]