redis学习(一)-基础知识
redis简介
- Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
- 特点:高并发读写,高效的存储和访问,很容易的扩展(因为表结构不固定,是key-value)
- 适用场合
1.取最新的N个数据
2.排行榜应用,取TOP N操作
3.需要精确的设定过期时间
4.计数器应用
5.Uniq操作,即数据去除重复
6.实时系统,反垃圾系统
7.Pub/Sub构建实时消息系统
8.构建队列系统
9.缓存 (最常用了)
简单总结
redis的安装使用
-
安装步骤:
第一步:redis的源码包上传到linux系统。
第二步:解压缩redis到 /usr/local
第三步:编译。进入redis源码目录输入 make
第四步:安装。make install PREFIX=/usr/local/redis
PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下 -
远程连接其他主机的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命令
- 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 指定减少的值,可为负数 |
- 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类型的无序集合,可以对集合求交集,并集,差集,可应用于好友推荐,tag标签查询等场景。 - zset类型
- keys命令
常用命令 | 描述 | 备注 |
---|---|---|
del | 批量删除key | 如某些key不存在,则直接忽略 |
exists | 返回key是否存在 | |
keys | 返回当前数据库指定正则匹配的key | |
rename | 将key重命名为newkey | 如果newkey已经存在,则值将被覆盖.可使用renamenx |
expire | 设置key的过期时间 | 其实超时后并不会马上删除 |
persist | 将keys设置为永久的 | |
ttl | 返回key的剩余过期时间 | |
type | 返回key所存储的value的数据结构类型 | 它可以返回string, list, set, zset 和 hash等不同的类型 |
sort | 返回排序后的元素列表 | |
scan | 迭代返回 | scan它们每次执行都只会返回少量元素, 而不会出现像 KEYS 或者 SMEMBERS 命令带来的可能会阻塞服务器的问题 |
move | 将key移动到另一个数据库 | |
migrate | 将key迁移到另一个redis服务的指定数据库上 |
- 连接和服务器配置常用命令
常用命令 | 描述 | 备注 |
---|---|---|
auth | auth password 验证密码登录 | |
ping | 测试连接,成功返回pang | |
select | 选择数据库 | |
config get | 读取redis服务器的配置文件参数 | * 可读取所有支持的配置参数 也可参看单独某个参数,如config get requirepass查看密码 (感觉这样很不安全) |
config set | 设置redis服务器的配置文件参数 | 如:可以用来设置密码(立即生效) config set requirepass 123456 服务器重启后修改会失效,若想长久保存可追加 “config rewrite”命令 |
flushdb | 删除当前数据库里面的所有数据 | |
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安全内容参考官方中文文档
2. redis的发布订阅
redis利用subscribe publish等命令可以构建一个简单的实时消息系统,但现在大多项目会集成消息中间件(如ActiveMq,RabbitMq等),但redis相较ActiveMq缺少持久化和可靠性的保证,因此使用并不多。
发布订阅
3. 管道命令
一次发送多个命令,节省往返时间
4. redis事务处理
- 服务端在事务的执行过程中,不会被其他客户端发送来的命令请求所打断
- multi开启事务,之后的命令会放到一个队列里,直到执行exec命令。discard清空事务队列, 并放弃执行事务。
- 如果事务中的某些命令出现错误,事务中的其他命令仍然会继续执行,整个事务不会回滚;但如果是语法错误,在入队列时就会被发现。
- redis乐观锁。被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。
- redis脚本和事务。从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。