redis简介
- Redis 是一个开源的,基于内存的NoSql数据库。 它支持多种数据结构
字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets), bitmaps, hyperloglogs 和 地理空间(geospatial)
。 Redis 内置了 复制,LUA脚本和磁盘持久化, 并通过 Redis哨兵(Sentinel)和集群(Cluster)保证了高可用。 - 特点:快!读写性能可达到10万/秒,这得益于所有数据都是存在内存中,而且采用单线程架构避免了线程之间切换和竞争带来的问题,并且采用了epoll来实现IO多路复用。
redis的安装使用
- 安装步骤:
第一步:redis的源码包上传到linux,或者直接下载
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
,具体版本列表查看http://download.redis.io/releases
第二步:tar xzf redis-3.0.7.tar.gz
第三步:ln -s redis-3.0.7.tar.gz redis
建立了一个软链接,不把redis目录固定在指定版本上,有利于未来升级。非必要
第四步:cd redis
第五步:make
第六步:make install
默认安装到/usr/local/bin,可以在任意目录下执行redis命令,也可以指定安装配置make install PREFIX=/usr/local/redis
。一般软件安装到/usr目录下
另外docker安装更加方便docker run -p 6379:6379 --name redis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
-
远程连接其他主机的redis远程连接其他主机的redis
vim redis.conf
注释以下绑定的主机地址#bind 127.0.0.1 或者bind 0.0.0.0
修改protected-mode no 或者config set requirepass 123 ->123是密码
防火墙通过6379端口 iptables -I INPUT -p tcp --dport 6379 -j ACCEPT -
后台启动
vim redis.conf
daemon yes
./redis-server …/redis.conf (可以特殊指定redis.conf) -
连接redis
./redis-cli -h 192.168.0.1 -p 6379 -
注册为windows服务
redis-server --service-install redis.windows.conf
卸载服务命令:
redis-server --service-uninstall
开启服务
redis-server –service-start
停止服务
redis-server –service-stop
常用redis命令
-
keys命令
dbsize返回当前数据库的key数量。时间复杂度是O(1),不用担心阻塞问题
keys 返回当前数据库指定正则匹配的key,因可能会阻塞较长时间生产环境禁用,推荐scan
scan 它们每次执行都只会返回部分元素(默认10个),不会出现像 KEYS 或者 SMEMBERS 命令带来的可能会阻塞服务器的问题。对应集合遍历内部元素的有hcan、sscan、zscan。exists
rename 重命名。如果newkey已经存在,则值将被覆盖.可使用renamenx
randomkey 随机返回一个键
del 批量删除key 。 如某些key不存在,则直接忽略expire 设置key的过期时间 。过期时间为负值会立即被删除。返回 -1没有设置过期时间,-2键不存在。list,hash不支持集合内部元素的过期功能
persist 将key设置为永久的
ttl 返回key的剩余过期时间type 存储的数据结构类型,即string,hash, list, set和zset的类型
object encoding返回内部的实际编码格式,如string结构类型其实内部对应着int embstr raw 三种编码格式迁移键可以使用move,dump+restore, migrate。推荐使用migrate,原子性操作,支持多个键,只需要在源redis上操作即可,简单方便。
-
string类型
常用命令 | 描述 | 备注 |
---|---|---|
set | 设置key value 如果已存在key 会覆盖(包括过期时间) | EX – 设置键key的过期时间,单位秒 PX – 设置键key的过期时间,单位毫秒 NX – 只有键key不存在的时才会设置key的值 XX – 只有键key存在的时才会设置key的值 SET命令加上选项已经可以完全取代SETNX, SETEX, PSETEX |
setrange | 从指定的offset处开始,覆盖value的一部分 | 和getrange对应 |
setex | SETEX key seconds value 设置过期时间 | 可以被set代替; psetex是以毫秒为单位 |
setnx | SET if Not eXists的简写 当key不存在时才设置 | 可以被set代替 |
mset | 批量设置key value | msetnx批量设置,是原子的,如果有一个key存在全部失败 |
getset | 设置key value并返回原来key对应的value | 和INCR一起使用可实现重置的计数功能 |
append | 追加value值 | |
get | 返回string类型的value | |
mget | 批量返回key的值 | |
getrange | 返回value中指定的子串 | |
strlen | 返回key的string类型value的长度 | |
incr | 将整数型的value值加1 | incrby 指定增加的值,可为负数 |
decr | 将整数型的value值减1 | decrby 指定减少的值,可为负数 |
缓存,降低数据库压力:
存储如共享session,JWTtoken等;校验用户获取验证码次数或者一天内登陆失败次数等等,利用注解+AOP来拦截实现
3. hash类型
将key值进行分类管理,并且大多情况下占用内存更少
常用命令 | 描述 | 备注 |
---|---|---|
hset | hset myhash:001 name xiaoming | |
hmset | 批量设置指定key哈希集中指定的字段 | |
hsetnx | 只在 key 指定的哈希集中不存在指定的字段时,设置字段的值 | |
hdel | 从 key 指定的哈希集中移除指定的域 | |
hexists | 返回hash里面field是否存在 | |
hget | ||
hmget | 批量返回指定key哈希集中指定的字段 | |
hgetall | 返回指定key哈希集中所有的字段和值 | hkeys 返回所有字段;hvals返回所有字段对应的值 |
hlens | 返回 key 指定的哈希集包含的字段的数量 | |
hincrby |
-
list列表
-
set集合
是string类型的无序集合,可以对集合求交集sinter,并集sunion,差集sdiff,可应用于好友推荐,tag标签查询等场景。标签的简单示例:
给用户添加标签sadd user:1:tags tag1 tag2 tag3
,sadd user:2:tags tag1 tag2 tag3
给标签添加用户sadd tag1:users user:1 user:2
,sadd tag2:users user:1 user:2
注意上面要放在一个事务中执行,可利用lua脚本
获取两个用户共有的标签sinter user:1:tags user:2:tags
-
zset有序集合
排行榜系统 -
连接和服务器配置常用命令
常用命令 | 描述 | 备注 |
---|---|---|
auth | auth password 验证密码登录 | |
ping | 测试连接,成功返回pang | |
select | 选择数据库 | |
config get | 读取redis服务器的配置文件参数 | * 可读取所有支持的配置参数 也可参看单独某个参数,如config get requirepass查看密码 (感觉这样很不安全) |
config set | 设置redis服务器的配置文件参数 | 如:可以用来设置密码(立即生效) config set requirepass 123456 服务器重启后修改会失效,若想长久保存可追加 “config rewrite”命令 |
flushdb | 清除当前数据库 | 危险命令,建议rename-command来规避 |
flushall | 删除所有数据库 | |
slaveof | SLAVEOF host port 变为指定服务器的从服务器 | 利用SLAVEOF NO ONE可以切换为主服务器 |
shutdown | 关闭redis服务 |
- 调试常用命令
常用命令 | 描述 | 备注 |
---|---|---|
info | 以一种易于理解和阅读的格式, 返回关于Redis服务器的各种信息和统计数值。 | |
monitor | 用于调试,开启后显示服务器当前执行的命令 | ctrl+c结束 |
object | 查看key的编码方式,被引用的次数,空闲时间 | |
dbsize | 返回当前数据里面keys的数量 | |
role | 返回主从角色 | |
client list | 返回连接的客户端列表 | |
client kill | 关闭指定客户端连接 |
redis基本特性
1. redis的安全性
-
在redis.conf配置文件里可以通过requirepass password 来设定密码;也可以在客户端通过config set requirepass password来设定密码(立即生效,但服务器重启后修改会失效,若想长久保存可追加 “config rewrite”命令)。然后连接redis(注意连接成功后但其实并未被授权),可通过auth password输入密码通过验证。注意:因为redis的查询服务特别快,因此密码要设置的足够长,防止暴力破解。
-
高版本的redis安装完默认只能本地连接 (bind 127.0.0.1),且开启了保护模式(protected-mode yes ),可以通过修改这两项来让其他客户端连接redis服务。
-
生产环境上对一些危险的命令(如flushdb,flushall,keys,config set,config get等)要禁用或重命名。具体做法是,修改服务器的配置文件redis.conf,在SECURITY这一项中,我们新增以下命令:
rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC81TbdkSmLAzRPmcarcR
rename-command FLUSHDB qf69aZbLAX3cf3ednHM3SOlbpH71yEXLAX3cf3e
rename-command CONFIG FRaqbC8wSA1XvpFVjCRGryWtIIZS2TRvpFVjCRG
rename-command KEYS eIiGXix4A2DreBBsQwY6YHkidcDjoYA2DreBBsQ
#如果要禁用则:
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
更多redis安全内容参考官方中文文档