我是跟着尚硅谷周阳老师的课程学习的,之前项目用过mongodb,但对redis和整个nosql都不是很熟悉,系统的学习下。
Redis和MongoDB的区别:
https://www.cnblogs.com/java-spring/p/9488227.html
1.Redis简介
-
Redis:REmote DIctionary Server(远程字典服务器)
-
完全开源免费,用C编写,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,别称数据结构服务器
-
特点
- 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启时可再次加载进行使用
- 不仅支持key-value类型的数据,也提供list、set、zset、hash等数据结构的存储
- 支持数据备份,即master-slave模式的数据备份
-
特别功能
- 内存存储和持久化:支持异步将内存中的数据写到硬盘上,同时不影响继续服务
- 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
- 模拟类似于HttpSession这种需要设定过期时间的功能
- 发布、订阅消息系统
- 定时器、计数器
2.Redis安装
https://redis.io/ 国外官网
http://redis.cn/ 国内官网
-
Windows安装
-
企业实战用Linux,那就Linux吧…
-
虽然那次做汇编实验,用VMware跑过WIN7,再重新按centos吧,我安装的是centos7。
-
centos7联网
-
运行make 命令时出现错误解析
安装gcc(需要联网)
-
二次make,清除一下之前生产的文件
-
再次make,安装完成
-
运行一下make install,检查是否安装成功
-
启动myredis
-
关闭连接
-
3.Redis 杂谈
-
redis有多个数据库,可以相互之间切换
数据库0有键值对(k1,hello),切换到数据库7则找不到k1所对应的值。select命令切换数据库,比如:
select 7
-
Dbsize查看当前数据库的key的数量
-
查看有几个键值对
keys *
-
清库!!
清除所有数据库
flushall
清除当前数据库
flushdb
4.Redis大纲
- 数据类型、基本操作和配置
- 持久化和复制、RDB/AOF
- 事务的复制
- 复制
5.Redis数据类型
Redis的五大数据类型
-
String(字符串)
-
最基本的类型,一个key对应一个value
-
二进制安全:redis的string可以包含任何数据,比如jpg图片或者序列化的对象
-
一个redis中字符串value最多可以是512M
-
-
Hash(哈希)
- 是一个键值对集合
- 是一个string类型的field和value的映射表,hash特别适合用于存储对象
-
List(列表)
- 按插入顺序排序,底层以链表实现
-
Set(集合)
- 无序无重复
- 通过HashTable实现
-
Zset(sorted set:有序集合)
- Redis的zset和set都是string类型元素的集合,并且不允许有重复的成员
- 二者不同在于zset每个元素都会关联一个double类型的分数
- 有序就是按照分数的大小来为集合中的成员进行排序
- zset中成员不可重复,但是分数(score)可以重复
6.数据类型的基本操作
-
数据类型操作命令的文档
http://redisdoc.com/
-
Redis键(key)
- exists key的名字:判断某个key是否存在
- move key db :将key-value从当前数据库移入db
- expire key 秒钟:为给定的key设置过期时间,过期之后使用keys *命令也查不到了,过期就移除数据库。
- ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已经过期
- type key:查看key的类型
- 将key存入数据库:set k1 v1
- 获取key:get k1
-
Redis字符串(String)
-
set/get/append/strlen
-
Incr/decr/incrby/decrby
- incr自增1,decr自减1
- incrby:incrby k1 3,增加指定数值;decrby同理
-
getrange/setrange
字符串切分,两端都是闭区间,例如执行以下命令
set k1 tb123456 getrange k1 0 3
结果:tb12
setrange就是部分赋值,一个道理
setrange k1 1 xxx
结果:txxx3456
-
setex(set with expire)键秒值/setnx(set if not exist)
设置键值对(k2,v2),10秒后过期
setex k2 10 v2
如果k3存在,返回0;如果不存在,设置并返回1
setnx k3 v3
-
mset/mget/msetnx
一次放多个键值对
-
-
Redis列表(List)
单键多值
-
Lpush/rpush/Lrange
-
Lpush就是正放反出,类似于栈
-
rpush先进先出,类似于队列
-
Lrange 后边带着3个参数,第一个是列表的key,后两个是区间,0 -1意思是列表的全部
-
lpop/rpop
每次除去一个,对应上一对命令
有点绕. -
Lindex
按照索引下标获得元素(从上到下),跟数组差不多
-
Llen
列表长度
-
Lrem key
删除N个value,比如:
删除list03中的3个5
-
Ltrim key
开始index,结束index,截取指定范围的值后再赋值给key,比如
-
rpoplpush 源列表 目的列表
有点计组指令的感觉了…挺好理解,把源列表的最下面一个值插到目的列表的最上面一个位置。
-
Lset key index value
把list01列表中第一个位置赋值为x
lset list01 1 x
-
Linsert key before/after 值1 值2
在list01列表中x前面插java,后面插oracle
Linsert list01 before x java Linsert list01 after x oracle
ps:因为列表值可以重复,插入是找到第一个值为x的位置来插入
-
性能总结
- 字符串链表,左右都可以插入添加
- 如果键不存在,创建新的链表
- 如果键已存在,新增内容
- 如果键全移除,对应的键消失
- 因为是链表实现,头尾插入效率比较高,但是在中间插入,效率比较低了,如果遍历搜索指定值来插入的话,时间复杂度为O(N)
-
-
Redis集合(Set)
-
sadd/smembers/sismember
-
scard:获取集合里面的元素个数
-
srem key value 删除集合中的元素
srem set01 3
-
srandmember key 某个整数(随机出几个数)
未测试成功,用的时候找文档吧。
-
spop key 随机出栈
-
smove key1 key2 在key1里某个值
将key1里的某个值赋给key2
-
数学集合类
- 差集:sdiff
- sdiff set01 set02
- 作用:返回在set01不在set02 里的元素,以下同理
- 交集:sinter
- 并集:sunion
- 差集:sdiff
-
-
Redis哈希(Hash)
KV模式不变,但V是一个键值对。什么意思呢?就是比如存user 吧,user作为一个键,对应也有一个V,但是这个V呢,是多个键值对,比如说user对应的value有name,有age;name又作为一个key,对应的值可以是zhangsan ,同理age对应的值是18。
-
hset/hget/hmset/hmget/hgetall/hdel
//得到多个 hmget user name age //设置多个 hmset user name zhangsan age 18 //得到所有 hgetall user //删除 user 中 name hdel user name
-
hlen:个数,比如刚才没删除之前hlen user ,结果就为2
-
hexists key:是否存在
hexists user name //返回1 hexists user password //不存在,则返回0
-
hkeys/hvals
-
hkeys 获取 所有key的名称
-
hvals 获取 所有value的值
hkeys user kvals user
-
-
hincrby/hincrbyfloat
-
-
Redis有序集合Zset(sorted set)
lzset01是有序集合的key,对应多个value,每一个value前面有一个分数
|-----60-----v1
|-----70-----v2
zset01-----|-----80-----v3
|-----90-----v4
|-----100-----v5
-
zadd/zrange
-
zrangebyscore key 开始score 结束score
zrangebysore zset01 60 90
结果:v1 v2 v3 v4
-
zrem key 某score下对应的value值,删除元素
-
zcard/zount key score区间/zrank key values值 获得下标值/zscore key 对应值,获得分数
-
zrevrank key values值, 作用是逆序获得下标值
-
zrevrange
-
zrerangebyscore key
-
7.配置文件redis.conf
好多图啊,上传好麻烦。。