redis学习
NoSQL(not only SQL),非关系型数据库
特点:
-
通常是以key-value形式存储
-
不支持SQL语句
-
没有表结构
优势:
-
高并发读写
-
大数据量的扩展
-
配置简单
-
灵活高效的操作与数据模型
-
配置简单
-
低廉的成本
缺点:
-
没有统一标准
-
没有官方支持,并不成熟
redis介绍
-
概述
-
Remote dictionary server(远程数据服务)的缩写
-
由C语言编写,数据模型为key-value
-
支持的value类型多,包括string,hash,list,set,zset
-
数据都是缓存在内存中,可以周期性的把更新的数据写入磁盘或把修改操作写入追加的记录文件
-
特点
-
高速读取数据
-
减轻数据库负担
-
有集合计算功能
-
多种数据结构的支持
-
适合场景
-
排行榜应用
-
获得最近N个数据
-
计数器应用
-
支持大量数据类型
-
原子性(要么成功执行,要么失败完全不执行)
-
丰富的特性,支持publish/subscribe,通知,key,过期等特性
和其他key-value存储的区别?
-
有更加复杂的数据结构并且提供原子性操作
-
运行在内存中并且持久到磁盘中
登录方法
-
第一个cmd窗口,打开服务器端
redis-server.exe redis.windows.conf
-
第二个cmd窗口,打开客户端
redis-cli.exe -h 127.0.0.1 -p 6379
-
测试方法
set myKey abc
get myKey
数据类型
string,hash,list,set,zset(sorted set:有序集合)
-
string
redis最基本的数据类型,可以包含任何数据,包括jpg或者序列化的对象。
最大能存储512MB
-
set
设置键,值
语法:set 键名称 值
set name xiaobao
-
get
获取key对应的string值,如果key不存在返回 nil
语法: get 键值
get name
-
incr
对key的值做++操作,并返回新的值,每执行一次值加1,值类型应该为数据类型
语法: incr key
set num 1
incr num
-
incrby
指定加多少
语法:incrby 加的数
incrby num 12
-
hash
用来存储对应的mysql中一行的数据,类似于关联数组
-
hset
设置hash里面的field和value的值
语法:hset 哈希的名称(键名称) field value
hset huang id 1
-
hget
获取hash里面的field值
语法:hget 哈希的名称 (键名称)field value
get huang id
-
hmset
一次性设置多个field和value
语法:hmset 哈希的名称 field1 value1 field2 value2 ...
hmset hash_name id 1 name huang
-
hmget
一次性获取多个field 的value
语法:hmget 哈希的名称 field1 field2
hmget hash_name id name
-
hgetall
获取指定hash中所有的filed和value
语法:hgetall 哈希的名称
hgetall hash_name
-
链表
关键词list,是双向链表
-
lpush
从链表的头部添加元素
语法: lpush 链表名称 (键的名称) 元素
lpush list1 first
-
lrange
获取链表里面的元素
链表里面的元素开始下标是0
语法:lrange 链表的名称 开始下标 结束下标
注意:
如果开始下标是0,结束下标是-1,则为返回链表中所有的元素
lrange list1 0 -1
-
rpush
从链表的尾部添加元素
语法:rpush 链表的名称 (键的名称) 元素
lpush list1 third
-
ltrim
保留指定范围的元素
语法:ltrim 链表的名称 开始下标 结束下标
ltrim list1 0 0
-
lpop
从链表的头部删除一个元素,返回删除的元素
语法:lpop 链表的名称
lpop list1
-
集合(set)
通过hash表来实现的
redis的set是string类型的无序集合
set元素最大可以包含(2 ^ 32 - 1)个元素
可以实现基本的添加,删除,还有集合的并集,交集,差集。很容易实现好友推荐功能
-
sadd
向集合中添加元素
语法:sadd 集合名(键名)元素名称
sadd set1 first sadd set1 second sadd set1 3
-
smembers
获取集合中的元素
语法:sembers 集合名
smembers set1
-
sdiff
获取集合中的差集(在集合1中存在,但是不在集合2中存在的元素)
语法:sdiff 集合1 集合2
sadd set2 first sdiff set1 set2
-
获取交集
语法:sinter 集合1 集合2
sinter set1 set2
-
求并集
两个集合合并之后,去掉重复的元素
语法:sunion 集合1 集合2
sunion set1 set2
-
scard
获取集合中元素的个数
语法:scard 集合名称
scard set1
-
zset
sorted set是set的一个升级版本,在set的基础上增加了一个顺序属性,这个属性在添加修改元素的时候可以指定,每次指定之后,zset会自动按照新的值调整顺序,操作中的key理解为zset的名字
-
zadd
向有序集合中添加元素,如果该元素存在,就更新其顺序
语法:zadd 集合名 序号 内容
zadd zset1 10 xiao
-
zrange
把集合排序后,返回名词[start,stop]的元素
默认是升序排列
语法:zrange 集合名称 开始下标 结束下标
zrange zset1 0 -1
-
zrevrange
按括号降序获取有序集合中的内容
语法:zrevrange 集合名称 开始下标(索引) 结束下标(索引)
zrevrange zset 0 -1
Redis常用命令
-
键值相关的命令
-
服务器相关的命令
-
key
返回当前数据库里面的键,可以使用通配符,*表示任意多个,? 表示任意一个字符
-
exists
删除指定的键
语法:del 键名称
-
expire
设置键的有效期
语法:expire key 有效期(秒数)
expire name 60
-
ttl
返回一个键剩余的过期日期
语法:ttl 键名
ttl name
-
type
返回数据类型
语法: type key
type name
-
select
选择数据库,在redis里面中默认有0~15号数据库,默认是0号数据库
可以通过redis.conf配置文件进行设置
-
flushdb
清空当前数据库中所有的键
-
flushall
清空所有数据库里面的所有的键
持久化机制
redis为了内存数据的安全考虑,会把内存中的数据以文件的形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存中
数据保存到硬盘的过程就是 ‘ 持久化’ 效果
redis支持两种持久化方式:
-
snapshotting(快照)默认方式
-
append-only file(缩写)的方式
snaoshotting 快照方式持久化
该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中(备份文件名字默认是dump.rdb) , 如果数据非常多(10~20G)就不适合频繁的进行该持久化操作
-
如何开启,默认开启是有自己的触发条件的
save 900 1 900秒内如果超过一个key被修改,则发起快照保存
-
社会保存位置和备份的文件名
备份文件名字默认是dump.rdb,我们也可以自己修改
可以通过配置文件来完成修改
-
手动发起快照
方法1:在登录状态,直接执行bgsave
方法2:在没有登录状态
./redis-cli bgsave
缺点:
由于快照方式是在一定间隔做一次,所以如果redis以外down掉的话,会失去最后一个快照后的所有修改
append-only-file 追加方式持久化AOF
本质:把用户执行的每个 ‘写’ 指令(添加,修改,删除) 都备份到文件中,还原数据的时候就是执行具体写指令而已
-
开启方式
打开redis.conf配置文件,进行打开配置
appendonly yes //启用aof持久化方式 appendfilename appendonly.aof // 保存命令的文件
-
触发条件
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用 appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 # appendfsync no //完全依赖 os,性能最好,持久化没保证
-
aof文件的重写
把多个incr指令换为一个set指令
问题 :每个命令重写一次aof,如果某个key操作100次,产生100行记录,aof文件会很大,怎么解决?
答:对aof文件进行重写,比如把执行10次incr number 压缩成 set number 11
语法:
./bin/redis/cli-a 密码 bgrewriteaof