Redis :Remote Dictionary Server
概述:Redis是一个基于内存的C语言实现的key-value结构的字典服务器;支持每秒11万次查询,8万1次写操作,常用作非关系型数据库NO-SQL
Redis和MySQL有什么区别?
数据关联性:
Redis:非关系型数据库,key-value结构,数据之间没有关联性
MySQL:关系型数据库,表与表之间存在关联关系
存储位置不同:
Redis数据存储在内存中, 虽然有持久化机制。
MySQL数据存储在磁盘中,一个库对应一个文件夹
应用场景:
Redis 主要做数据缓存,作为分布式锁,消息队列(不常用)
MySQL主要用于存储数据
Redis服务配置
linux:
找到配置文件,做如下修改
默认只能本机访问 ,注释掉
bind 127.0.0.1
默认开启受保护模式,修改成no, 即允许外部(远程访问)
protected-mode yes
默认是被注释的,解除注释,修改密码,使用密码登录
requirepass 密码
防火墙开放6379端口
重启服务
redis-server 启动脚本,参数是配置文件
示例:
/usr/local/redis-4.0.0/src/redis-server /usr/local/redis-4.0.0/redis.conf
redis-cli 客户端脚本
./redis-cli -h ip -p 6379 -a 密码
Redis有8种数据类型,其中5种为常见数据类型,也是经常使用的
一、string
key : value 结构
1 设置值set
格式:set key value
示例:set name zhangsan
2 设置带有过期时间的key,单位秒
格式:setex key time value
存一个有效期20秒的 key为name, value为zhangsan的键值对
示例:setex name 20 zhangsan
3 带条件的设置setnx ------【常做分布式中的锁】
格式:setnx key value
解释:判断性添加,如果key不存在,添加键值对,存在不做处理返回0。
值得一说的是,setnx无法在设置key的同时设置失效时间,想要设置就要使用expire key time
然而这两步就不是一个原子操作,多线程会有问题,推荐使用redisson,其实现就是redis + lua脚本
4 获取值get
格式:get key
示例:get name
5 删除key
del key
6.1 如果value是int类型的,可以使用incr/decr对值进行自增/自减
示例
设置值: set a 10
incr a 自增1
decr a 自减1
应用场景:app应用中的 点赞数的记录
6.2 还有 自增自减指定的值
incrby key 更新数值
decrby key 更新数值
7 批量设置key-value
mset key1 value1 key2 value2...
批量获取值
mget key1 key2 ...
8. 在key对应的value后,追加内容
append key value
9. 查看value字符串的长度
strlen key
二、hash
key : [key1 : value1 , 2 : value2 …]
一个大key下存储多个key-value
适合存储序列化后的对象
1 设置值hset
格式:hset key key1 value1
示例:hset java javaSE 111,javaEE 222
2 获取值hget
格式:hget key field value
根据大key再根据小key获取值
示例:hget java javaEE
3 删除小key hdel key key1
示例:hdel java javaSE
4 获取key关联的所有小key列表:hkeys
格式:hkeys key
示例:hkeys java
5 获取key关联的所有小key对应的值:hvals
格式:hvals key
6 获取key关联的所有小key和值:hgetall
格式:hgetall key
7 批量操作
hmset key key1 value1 key2 value2...
hmget key key1 key2...
8 自增(指定自增的值)
hincrby key key1 更新值
9 统计key下的小key个数
hlen key
三、list
结构 key : value1,value2 …
有序,可以重复
每一个key 代表一个list,key 就是list的名字,不要看蒙了哈
1 从左边入队:lpush
格式:lpush key value1 , value2 ....
2 更新指定索引位置的值
lset key index value
3 弹出(移除)最左边的value,并返回值:lpop
格式:lpop key
4 弹出(移除)最右边的value,并返回值:rpop
格式:rpop key
5 阻塞等待式弹出:brpop
格式:brpop key
解释:弹出(移除)最右边的value,并返回值,
如果key内没有value, 等待指定时间,没有指定时间一直阻塞等待。
6 计算list的长度:llen
格式:llen key
7 获取key对应的指定范围的元素:lrange
格式:lrange key startIndex stopIndex
解释:返回从开始到最后即倒数第一个范围内的元素列表
示例 : lrange key 0 -1
8 获取指定索引位置的数据
lindex kek index
四、set
结构: key : value1,value2 …
无序,不重复
1 新增集合元素:sadd
格式:sadd key value1 value2 ...
解释:新增集合key,并添加元素value ,重复元素会自动过滤
2 获取集合所有元素:smembers
格式:smembers key
3 求集合的元素个数:scard
格式:scard key
4 集合求交集:sinter
格式:sinter key1 key2 ...
5 集合求并集:sunion
格式:sunion key1 key2 ...
6 集合求差集:sdiff
格式:sdiff key1 key2 ...
解释:找key1中key2没有的元素(value), 就是求差集 或者说 补集
7 删除元素:srem
格式:srem key value1 [value2 ...]
解释:删除key中 指定的 一个或多个元素
五、sortedset
结构: key : a (score1) , b (score2) ,c (score3) …
a、b、c 为value之一,score 为double类型的分值 或者说 权重,
score 用作排序。
别名 zset 即有序的set
不可重复、有序
1 新增集合元素:zadd
格式:zadd key score1 value1 [score2 value2 ...]
解释:向有序集合添加一个或多个值,带分数
2 获取指定范围内有序集合的元素列表:zrange
格式:zrange startIndex stopIndex [WITHSCORES]
3 更新分值:zincrby
格式:zincrby key increment value
解释:修改指定的value 的分数
示例:zincrby name -5 zhangsan
4 删除集合中元素:zrem
格式:zrem key value1 [value2 ...]
5 查看指定的的value分数
zscore key value
6 根据score的范围查询member数量
zcount key min max
另外 删除key 的通用方法是 del key
1. 查看Redis中的全部的key(pattern: *, xxx*, *xxx)
keys pattern
2. 查看某一个key是否存在(1 - key存在,0 - key不存在)
exists key
3. 删除key
del key [key ...]
4. 设置key的生存时间,单位为秒,单位为毫秒,设置有效时长
expire key second
pexpire key milliseconds
5. 设置key的生存时间,单位为秒,单位为毫秒,设置能活到什么时间点
expireat key timestamp
pexpireat key milliseconds
6. 查看key的剩余生存时间,单位为秒,单位为毫秒(-2 - 当前key不存在,-1 - 当前key没有设置生存时间,具体剩余的生存时间)
ttl key
pttl key
7. 移除key的生存时间(1 - 移除成功,0 - key不存在生存时间,key不存在)
persist key
8. 选择操作的库
select 0~15
9. 移动key到另外一个库中
move key db