Redis是由一个键指向一个值,而这个值可以是字符串、哈希、列表、无序集合和有序集合
字符串类型命令
字符串类型由键和值组成
- 查询键 keys
keys * #查看所有,*用于匹配规则
- 设置键和值,若键存在则覆盖 set
#set 键名 值
set name zhangsan
- 设置一个不存在的键和值,若存在返回0 setnx
#setnx 键名 值
setnx name zhangsan
- 设置一个指定有效期的键和值 setex
#setex 键名 过期时间 值
setex name 10 zhangsan #10秒后过期
- 替换字符串,替换长度又替换部分决定 setrange
#setrange 键名 位置 替换部分
setrange name 3 aaa #从第三个位置开始替换aaa,索引从0开始
- 批量设置键和值 mset
#mset 键1 值1 键2 值2
mset name zhangsan age 12
- 批量设置不存在键和值,成功返回OK msetnx
#msetnx 键1 值1 键2 值2
msetnx name zhangsan age 12
- 获取原有的值并设置新值 getset
#getset 键名 新值
getset name lisi
- 获取对应键的值 get
#get 键名
get name
- 批量获取 mget
#mget 键1 键2 键3
mget name age
- 获取该键对应的值上指定范围的部分值 getrange
#getrange 键名 起始位置 结束位置
getrange name 2 4 #获取字符串上第2到第4位的值,索引从0开始
- 判断某键是否存在 exists
#exists 键名
exists name
- 删除键 del
#del 键名
del name
- 设置过期时间 expire
#expire 键名 时间
expire name 10 #10秒后过期
- 查看过期时间 ttl
#ttl 键名
ttl name #结果是-1表示永不过期,-2则是已过期
- 移除过期时间 persist
#persist 键名
persist name
- 移动键到别的库,redis默认有16个库(0~15) move
#move 键名 数据库号码
move name 12 #移动name键到第12号库
- 进入库 select
#select 数据库号码
select 12 #进入12号库
- 删除当前库的所有数据 flushdb
flushdb #只清空当前库
- 清空所有数据 flushall
flushall #清空所有的库
- 指定键做自增操作,只作用于数字 incr
#incr 键名
incr age #如果age是11,自增为12
- 指定键加上指定的值 incrby
#incrby 键名 值
incrby age 12 #age加上12
- 指定键做自减操作 decr
#decr 键名
decr age #age自减
- 指定键减去指定的值 decrby
#decrby 键名 值
decrby age 12 #age减去12
- 给指定的键追加值 append
#append 键名 追加值
append name aaa #name字符串加上aaa
- 获取值的长度 strlen
#strlen 键名
strlen name
哈希类型命令
哈希由键和哈希表组成,哈希表中又可以存多个键值对,哈希表名:{键:值}
- 设置哈希表的键和值 hset
#hset 哈希名 键名 值
hset hashname name zhangsan
- 批量设置哈希表的键和值 hmset
#hmset 哈希名 键1 值1 键2 值2
hmset hashname name zhangsan age 18
- 设置一个哈希表中不存在的键和值 hsetnx
#hsetnx 哈希名 键名 值
hsetnx hashname sex 0
- 获取哈希表的值 hget
#hget 哈希名 键名
hget hashname name
- 批量获取哈希表的值 hmget
#hmget 哈希名 键1 键2 键3
hmget hashname name age sex
- 获取哈希表中所有的值 hgetall
#hgetall 哈希名
hgetall hashname
- 获取哈希表中键的数量 hlen
#hlen 哈希名
hlen hashname
- 删除哈希表中的键 hdel
#hdel 哈希名 键名
hdel hashname name
- 判断哈希表中是否存在该键 hexists
#hexists 哈希名 键名
hexists hashname name
- 返回哈希表中所有的键 hkeys
#hkeys 哈希名
hkeys hashname
- 返回哈希表中所有的值 hvals
#hvals 哈希名
hvals hashname
List列表(双向链表结构)
Redis列表是最简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左侧)或尾部(右侧)
List可以作为栈,也可以作为队列(队列是从头部存,从尾部取)
- 往头部压入一个字符串 lpush
#lpush 列表名 字符串
lpush listname aaa
- 往尾部压入一个字符串 rpush
#rpush 列表名 字符串
rpush listname bbb
- 获取列表内容 lrange
#lrange 列表名 开头 结束
lrangelistname 0 -1 #0到-1代表获取全部,0:表示开头 -1:表示结束
- 在指定字符串位置前或后添加字符串 linsert
#linsert 列表名 before 指定字符串 添加字符串
linsert listname before bbb a2 #在bbb前面添加a2
#linsert 列表名 after 指定字符串 添加字符串
linsert listname after bbb b2 #在bbb后面添加b2
- 修改指定索引位置上的值 lset
#lset 列表名 索引 新字符串
lset listname 1 change #把索引为1的字符串改为change
- 删除指定方向、数量、字符串的值 lrem
#lrem 列表名 整数 指定字符串
lrem listname -2 aaa #删除aaa后2个字符串
#整数:正数表示前几个,负数代表后几个,0表示所有
- 删除指定范围外的所有值 ltrim
#ltrim 列表名 起始索引 结束索引
ltrim listname 1 2 #删除除了1到2之外所有字符串
- 从头部删除元素(出栈),并返回 lpop
#lpop 列表名
lpop listname
- 从尾部删除元素,并返回 rpop
#rpop 列表名
rpop listname
- 将一个列表尾部的元素转移到一个列表的头部 rpoplpush
#rpoplpush 出栈列表 入栈列表
rpoplpush listname list2 #将listname中的最后一个字符串转移到list2的第一个
- 返回列表中该索引位的元素 lindex
#lindex 列表名 索引
lindex listname 2
- 返回列表元素长度 llen
#llen 列表名
llen listname
Set无序集合
Set是string类型的无序集合。集合的成员时唯一的,这就意味着集合中不能出现重复的数据。
- 添加一个元素 sadd
#sadd 集合名 '字符串'
sadd setname aaa
- 获取集合中所有元素(结果是无序的) smembers
#smembers 集合名
smembers setname
- 删除集合中的一个字符串 srem
#srem 集合名 '字符串'
srem setname aaa
- 随机返回并删除集合中一个元素 spop
#spop 集合名
spop setname
- 随机获取集合中的一个元素 srandmember
#srandmember 集合名
srandmember setname
- 移动元素到另一个集合 smove
#smove 集合1 集合2 字符串
smove setname set2 aaa #将aaa从setname转移到set2
- 返回集合中元素个数 scard
#scard 集合名
scard setname
- 判断元素是否存在集合中 sismember
#sismember 集合名 字符串
sismember setname aaa #判断setname中是否存在aaa
- 返回两个集合的差集 sdiff
#sdiff 集合1 集合2 #以第一个集合为标准,获取第二个集合中不存在的
sdiff setname set2 #以setname为标准,获取set2中不存在的字符串
- 获取所有集合的差集,并存到新的集合中 sdiffstore
#sdiffstore 新集合名 集合1 集合2 。。。。
sdiffstore newset setname set2 set3 #分别获取set2和set3对于setname的差集,存入newset中
- 返回多个集合中的交集 sinter
#sinter 集合1 集合2 。。。。
sinter setname set2 #返回setname和set2的交集
- 返回多个集合的交集,并存到新的集合中 sinterstore
#sinterstore 新集合名 集合1 集合2 。。。。
sinterstore newset setname set2 set3 #将setname、set2、set3的交集存入newset
Sset有序集合
有序集合也是string类型元素的集合,不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合成员时唯一的,但分数可以重复。
- 向集合中添加分数和元素 zadd
#zadd 集合名 分数 字符串
zadd setname 60 aaa #分数可以随便给,分数只决定排序
- 删除集合中的元素 zrem
# zrem 集合名 字符串
zrem setname aaa
- 给指定元素增加分数值 zincrby
#zincrby 集合名 增加分数 字符串,如果元素存在,增加值。不存在,创建值
zincrby setname 20 aaa #如果aaa存在,分数加20,不存在,则创建aaa,分数为20
- 根据分数将元素从小到大排序 zrange
#zrange 集合名 0 -1 withscores
zrange setname 0 -1 withscores #0到-1指的是所有元素
- 根据分数将元素从大到小排序 zrevrange
#zrevrange 集合名 0 -1 withscores
zrevrange setname 0 -1 withscores
- 返回元素在集合中的排名(从小到大) zrank
#zrank 集合名 元素
#zrange setname aaa #返回的是排名
- 返回元素在集合中的排名(从大到小) zrevrank
#zrevrank 集合名 元素
zrevrank setname aaa
- 返回集合中指定区间内的元素 zrangebyscore
#zrangebyscore 集合名 起始分数 结束分数 withscores
zrangebyscore setname 20 50 withscores #返回20分到50分之间的元素
- 返回集合中给定区间的元素数量 zcount
#zcount 集合名 起始分数 结束分数
zcount setname 30 40 #返回30分到40分之间的元素
- 返回集合中元素的个数 zcard
#zcard 集合名
zcard setname
- 返回指定元素的分数 zscore
#zscore 集合名 元素
zscore setname aaa
- 删除集合中排名在指定区间内的元素(从小到大) zremrangebyrank
#zremrangebyrank 集合名 起始排名 结束排名
zremrangebyrank setname 2 5 #删除第2到第5名的元素
- 删除集合中分数在指定区间的元素 zremrangebyscore
#zremrangebyscore 集合名 起始分数 结束分数
zremrangebyscore setname 20 40 #删除20分到40分之间的元素
Redis高级
通过redis配置文件设置密码参数,提高redis服务的安全性
- 查看是否设置了密码
config get requirepass
- 设置临时密码(服务重启后不再生效)
config get requirepass '密码'
-
修改配置文件
1.打开redis.conf 文件
2.在requirepass foobared下加上 # requirepass 密码
-
重启服务
sudo service redis restart
-
登录(两种方法)
1.连接redis的时候输入密码
./redis-cli -a 密码
2.进入后使用auth指令
auth 密码
Redis事务
事务是将多条语句组成一个单元,要么都成功,要么都失败
- 开启一个事务队列
multi
- 暂存指令
指令就是上面的操作指令
set name zhangsan #指令1
set age 23 #指令2
- 开始执行(提交事务)
exec
- 清空指令队列(事务回滚)
discard #就是取消之前的操作
Redis乐观锁
在redis中,乐观锁是对某一个key发起一个监视,接下来进行事务,如果在事务执行前,key的值发生改变,则事务执行失败(被打断)
- 开启监视
#watch 键名
watch name #监视name这个键
Redis持久化机制
保证电脑宕机后数据的保存,定期将数据写入磁盘,没有持久化就不算数据库
-
1.snapshotting(快照) 默认方式
配置 redis.conf 中的 save
save 900 1 # 900秒内超过一个key被修改,则保存
save 300 10 # 300秒内超过10个key被修改,则保存
save 60 10000 #60秒内超过10000个key被修改,则保存
-
2.Append-only file (aof方式)
1.配置 redis.conf 中的 appendonly no 改为 yes
2.会在bin目录下产生一个.aof文件
3.配置 redis.conf 中的写入方式 appendfsync
appendfsync always #收到写命令就立刻写入磁盘,最慢,但保证持久化
appendfsync everysec #每秒写入磁盘一次,在性能和持久化方面做折中处理
appendfsync no #完全依赖os,性能最好,不保证持久化
Redis发布和订阅
redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
- 订阅频道
#subscribe 频道名称
subscribe cctv #创建一个cctv频道
- 发布消息
在另一个客户端发布内容
#publish 频道名称 '发布内容'
publish cctv HelloWorld