redis初识及基本操作
一.redis介绍:
1.Redis是什么:
REmote DIctionary Server(远程字典服务器)
是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key-Value)分布式内存数据库。
基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人称为数据结构服务器。
2.Redis的三个特点:
1)Redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用 2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储 3)Redis支持数据的备份,即master-slave模式的数据备份
3.Redis能干啥:
1)内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。 2)取最新记录。如:将最新的10条评论的ID放在Redis的List集合里面。 3)模拟类似于HttpSession这种需要设定过期时间的功能 4)发布、订阅消息系统 5)定时器、计数器
4.redis使用场景
1、对数据高并发的读写,可以使用redis数据库。 2、对海量数据的高效率的存储和访问,可以使用redis数据库。 3、对数据的高可扩展性和高可用性要求比较高的也可以使用redis数据库。
4.对列
二.redis简单命令使用
1.启动与关闭
1.启动
- 服务端:service redisd start 或者 redis-server(前端启动)
- 客户端:radis-cli -h ip -p port(6798)
2.关闭:由客户端关闭:
- 连接状态:shutdown
- 非连接状态:redis-cli shutdown
2.增
set k1 v1
3.查
get k1
4.改
getset k1(数据库已经存在的值)
5.key通用操作
keys * 查询所有的key
exists key #测试指定key是否存在
del key1 key2 key3 #删除给定的key
type key #返回给定的value的类型
keys pattern #返回匹配指定模式的所有key
rename oldkey newkey#改名字
dbsize #返回当前数据库的key数量
expire key seconds #为key指定过期时间(生命周期)
#没有生命周期,生存时间是-1(永久生存) ttl key #返回key的剩余过期秒数(还有多少寿命,过期-2了就会被删除,)
select db-index #选择数据库
move key db-index #将key从当前数据库移动到指定数据库
flushdb #删除当前数据库中所有key
flushall #删除所有数据库中的所有key
三. redis的五大基础数据类型
key | value | 备注 |
k1 | '小明' | string |
k2 | {name:张三,age:18} | hash |
k3 | [1,2,3,4,5] | list 添加删除效率极高 |
k4 | ['a','b'] | set |
k5 | [5000'金牌',3000'银牌'] | 有序的set |
1.字符串
String(字符串)
string是redis最基本的类型,string类型是二进制安全的。可以包含任何数据。
比如jpg图片或者序列化对象。一个redis字符串value最多可以是512M。
为什么二进制是安全的:
字符串常用操作和命令: 1.追加 (相当于拼接) append key value(如果key不存在则创建一个key)
2.获得字符串长度
strlen key
3.针对数字的操作(一定要是数字)
增1: incr key (如果可以不存在,则创建key,并默认为0 ,增1之后就是1,如果key不是数字类型则返回错误信息)
减1: decr key(如果可以不存在,则创建key,并默认为0 ,减1之后就是-1,如果key不是数字类型则返回错误信息)
增一定值: incrby key 10(key的值加10)
减一定值1: decrby key 5(key的值减五)
4.截取操作
getrange 键 起始坐标 结束坐标(-1表示全部)
5.范围替换
setrange key 起始坐标 替换内容
6.创建的时候设置过期时间(set with expire)
创建并设置:setex key 秒速 值
7.不存在才能创建(存在则不会创建)(set if not exist)
setnx key value
8.创建多个和获取多个
mset/mget k1 va k2 vb ==>msetnx(不存在才能创建成功)
![](https://img2018.cnblogs.com/blog/1513642/201902/1513642-20190223212733035-110893753.png)
9.先获取再改值
getset k1 llaa(拿到k1的值并把k1的值修改为llaa)
![](https://img2018.cnblogs.com/blog/1513642/201902/1513642-20190223213031036-864458416.png)
注意:key不能太长也不能太短,否则会影响效率,最好有代表意义
10.赋值
set key value:创建一个可以并赋值,如果可以已存在则覆盖
11.取值
get key value:取出key的之,这个值必须是String类型,否则会报错,get只能用于String类型,不存在返回(nil)
12.删值
del key 返回值为整形,表示删了几条数据
2.Hash(哈希)
类似于python的字典
Redis hash 是一个键值对集合。是一个string类型的field和value的映射表,hash特别适合用于存储对象
其实就是类似于字典套字典的结构:{hash:{key:value}}
常用命令操作:
1)hset/hget/hmset/hmget/hgetall/hdel key field value
![](https://img2018.cnblogs.com/blog/1513642/201902/1513642-20190223220043278-1556050310.png)
2)查询长度 hlen
3)某key是否存在某key hexists key1 key2
4)获取所有key hkeys key
5)获取所有value hvals key
6)加法 hincrby/hincrbyfloat
7)存在则赋值 hsetnx key主 key子 value
3.List(列表)
底层是个链表,相当于python中的List,关于链表的概念,看下图
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。
这使得list既可以用作栈,也可以用作队列
为什么选择链表:redis中进行最多的就是增删!!!
常用命令
1)lpush/rpush/lrange
![](https://img2018.cnblogs.com/blog/1513642/201902/1513642-20190223224850521-1847079664.png)
2)左出右出 lpop/rpop
![](https://img2018.cnblogs.com/blog/1513642/201902/1513642-20190223225332733-951877885.png)
3)按坐标获取元素 lindex 键 下标序号
4)获取集合长度 llen 键
5)删除N个值 lrem 键 个数 值
6)截取指定范围的值后再赋值给key ltrim key 开始位置 结束位置
7)转移1个元素 rpoplpush 原列表 目的列表 (从原来列表尾部弹出到目标列表头部)
如果原列表和目标列表是同一个,就变成循环列表了
8)替换某个位置的值 lset key index value
9)在某个值旁边插入某个值 linsert key before/after 值1 值2
总结:
一、键不存在,创建新的链表,键已存在,新增内容。
二、没有值则对应键也消失
三、对头位置处理快,中间位置很尴尬~
4.Set(集合)
Redis的Set是string类型的无序不重复集合,它是通过HashTable实现的
set元素最大可以包含(2的32次方-1)个元素。
关于set集合类型除了基本的添加删除操作,
其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。
常用命令
0)添加 sadd set1 v1/v2 重复的不会添加
1)插入 set key value1/value2/value3(value重复有且只添加一个) 2)查看 smembers key 3)存在多少个某值 sismember key value 4)获取集合里面的元素个数 scard key 5)删除集合中元素 srem key value 6)某个整数(随机出几个数) srandmember key 个数 7)随机出栈 spop key 8)将key1的某个值赋给key2 smove key1 key2 value 9)数字集合类的处理 差集:sdiff 源key 目标key 交集:sinter 源key 目标key 并集:sunion 源key 目标key
10)取到我们要的结果,存在另一个新的集合里面
sunionstore/sdiffstore/sinterstore destination key[key...]
5.Zset(sorted set:有序集合,可以做排行榜)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员Redis
不同的是每个元素都会关联一个double类型的分数
redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
常用命令
1)添加一个有序集合 zadd key 分数1 value1 分数2 value2
zadd set1 200 xioaming 500 xiaohong 400 xiaozhang (集合添加后就固定顺序了,从小到大)
2)获取值 zrange key 起始位置 结束位置
zrange set4 start end[with score](范围查询,获得脚标为为start到end,with score还代表了指定分数的成员 0 -1)
3)连值带分数的获取 zrange key 起始位置 结束位置 withscores
4)根据分数范围来获取 zrangebyscore key 开始分数 结束分数
注:给结束分数带 ( 表示不包含 +limit 起始偏移量 截取个数
5)某分数下对应的value值,删除元素
zrem key
zrem set4 xiaoming(删除指定成员)
6)获取个数 zcard
zcard set4 (查看集合的key的个数)
7)获取分数区间个数 zcount key 开始分数 结束分数
8)根据值获取下标 zrank key value
9)根据值获取分数 zscore key value
zscore set1 xiaoming (返回指定成员的分数)
10)逆序获取下标 zrevrank key value
11)逆序输出值 zrevrange key 开始位置 结束位置
zrevrange set4 start end[with score] 逆序输出,由大到12)逆序分数获取值 zrevrangebyscore key 高分数 低分数
13)范围删除值 zremrangebyrank key start stop
zremrangebyrangk set1 0 1 把前两个删除
14)根据值范围删除
zremrangebyscore set1 500 1000
15)根据范围取最大最小值
zranggebyscore set1 500 1000 limit 0 1
16)在范围区间有多少个元素
zcount set1 500 1000
17)排名
zrangk set1 xiaoming (返回索引值)
18)倒叙排名
zrevrangk set xiaoming
![](https://img2018.cnblogs.com/blog/1513642/201902/1513642-20190224093456577-534162461.png)
四. 消息的订阅与发布
类似弹窗消息(qq弹出新闻)
1. PUBLISH channel msg 将信息 message 发送到指定的频道 channel
2.SUBSCRIBE channel [channel ...] 订阅频道,可以同时订阅多个频道
3.UNSUBSCRIBE [channel ...] 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道 4.PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等),
news.* 匹配所有 以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类 5.PUNSUBSCRIBE [pattern [pattern ...]] 退订指定的规则, 如果没有参数则会退订所有规则 6.PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态 注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。
五.redis多数据库
1. mysql可以自定义数据库 create database xxx
2. redis默认有16个数据库(0-15) 默认在0号数据库
3. 切换数据库select (0-15)
4. 数据库与数据库不能共享键值对
5. 数据库的之间的数据移植
move key1 5(把当前数据库key1移动到5号数据库)
六.redis事务
1. mysql事务保证数据的完整性
2. redis事务保证数据可批量化进行
multi:事务开启(开启队列,事务开启后,没有提交之前,全部加到query等待exec提交) begin transation
exec:提交(队列中可以执行的都执行,即使中间有某些事务执行不成功,后面的也会继续执行) commit
discard:回滚(把执行队列中的所有操作) rollback
七.redis其他命令
1. dbsize:数据库中key的数量
2. info 关于redis数据库的信息
3. qiut 断开连接
4.ping
pong连接上了