redis学习

Redis

NoSQL(not only SQL),非关系型数据库

特点:

  • 通常是以key-value形式存储

  • 不支持SQL语句

  • 没有表结构

优势:

  • 高并发读写

  • 大数据量的扩展

  • 配置简单

  • 灵活高效的操作与数据模型

  • 配置简单

  • 低廉的成本

缺点:

  • 没有统一标准

  • 没有官方支持,并不成熟

 

redis介绍

  1. 概述

  • Remote dictionary server(远程数据服务)的缩写

  • 由C语言编写,数据模型为key-value

  • 支持的value类型多,包括string,hash,list,set,zset

  • 数据都是缓存在内存中,可以周期性的把更新的数据写入磁盘或把修改操作写入追加的记录文件

  1. 特点

  • 高速读取数据

  • 减轻数据库负担

  • 有集合计算功能

  • 多种数据结构的支持

  1. 适合场景

  • 排行榜应用

  • 获得最近N个数据

  • 计数器应用

     

  • 支持大量数据类型

  • 原子性(要么成功执行,要么失败完全不执行)

  • 丰富的特性,支持publish/subscribe,通知,key,过期等特性

和其他key-value存储的区别?

  • 有更加复杂的数据结构并且提供原子性操作

  • 运行在内存中并且持久到磁盘中

 

登录方法

  1. 第一个cmd窗口,打开服务器端

redis-server.exe redis.windows.conf
  1. 第二个cmd窗口,打开客户端

redis-cli.exe -h 127.0.0.1 -p 6379
  1. 测试方法

set myKey abc
get myKey

 

 

数据类型

string,hash,list,set,zset(sorted set:有序集合)

  • string

redis最基本的数据类型,可以包含任何数据,包括jpg或者序列化的对象。

最大能存储512MB

  1. set

设置键,值

语法:set 键名称 值

set name xiaobao
  1. get

获取key对应的string值,如果key不存在返回 nil

语法: get 键值

get name
  1. incr

对key的值做++操作,并返回新的值,每执行一次值加1,值类型应该为数据类型

语法: incr key

set num 1
incr num
  1. incrby

指定加多少

语法:incrby 加的数

incrby num 12
  • hash

用来存储对应的mysql中一行的数据,类似于关联数组

  1. hset

设置hash里面的field和value的值

语法:hset 哈希的名称(键名称) field value

hset huang id 1
  1. hget

获取hash里面的field值

语法:hget 哈希的名称 (键名称)field value

get huang id
  1. hmset

一次性设置多个field和value

语法:hmset 哈希的名称 field1 value1 field2 value2 ...

hmset hash_name  id 1 name huang
  1. hmget

一次性获取多个field 的value

语法:hmget 哈希的名称 field1 field2

hmget hash_name id  name
  1. hgetall

获取指定hash中所有的filed和value

语法:hgetall 哈希的名称

hgetall hash_name
  • 链表

关键词list,是双向链表

  1. lpush

从链表的头部添加元素

语法: lpush 链表名称 (键的名称) 元素

lpush list1 first
  1. lrange

获取链表里面的元素

链表里面的元素开始下标是0

语法:lrange 链表的名称 开始下标 结束下标

注意:

如果开始下标是0,结束下标是-1,则为返回链表中所有的元素

lrange list1 0 -1
  1. rpush

从链表的尾部添加元素

语法:rpush 链表的名称 (键的名称) 元素

lpush list1 third
  1. ltrim

保留指定范围的元素

语法:ltrim 链表的名称 开始下标 结束下标

ltrim list1 0 0
  1. lpop

从链表的头部删除一个元素,返回删除的元素

语法:lpop 链表的名称

lpop list1
  • 集合(set)

通过hash表来实现的

redis的set是string类型的无序集合

set元素最大可以包含(2 ^ 32 - 1)个元素

可以实现基本的添加,删除,还有集合的并集,交集,差集。很容易实现好友推荐功能

  1. sadd

向集合中添加元素

语法:sadd 集合名(键名)元素名称

sadd set1 first
sadd set1 second
sadd set1 3
  1. smembers

获取集合中的元素

语法:sembers 集合名

smembers set1
  1. sdiff

获取集合中的差集(在集合1中存在,但是不在集合2中存在的元素)

语法:sdiff 集合1 集合2

sadd set2 first
sdiff set1 set2
  1. 获取交集

语法:sinter 集合1 集合2

sinter set1 set2
  1. 求并集

两个集合合并之后,去掉重复的元素

语法:sunion 集合1 集合2

sunion set1 set2
  1. scard

获取集合中元素的个数

语法:scard 集合名称

scard set1
  • zset

 

sorted set是set的一个升级版本,在set的基础上增加了一个顺序属性,这个属性在添加修改元素的时候可以指定,每次指定之后,zset会自动按照新的值调整顺序,操作中的key理解为zset的名字

  1. zadd

向有序集合中添加元素,如果该元素存在,就更新其顺序

语法:zadd 集合名 序号 内容

zadd zset1 10 xiao
  1. zrange

把集合排序后,返回名词[start,stop]的元素

默认是升序排列

语法:zrange 集合名称 开始下标 结束下标

zrange zset1 0 -1
  1. zrevrange

按括号降序获取有序集合中的内容

语法:zrevrange 集合名称 开始下标(索引) 结束下标(索引)

zrevrange zset 0 -1

 

Redis常用命令

  1. 键值相关的命令

  2. 服务器相关的命令

  • 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支持两种持久化方式:

  1. snapshotting(快照)默认方式

  2. append-only file(缩写)的方式

 

snaoshotting 快照方式持久化

该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中(备份文件名字默认是dump.rdb) , 如果数据非常多(10~20G)就不适合频繁的进行该持久化操作

  1. 如何开启,默认开启是有自己的触发条件的

save 900 1 900秒内如果超过一个key被修改,则发起快照保存
  1. 社会保存位置和备份的文件名

备份文件名字默认是dump.rdb,我们也可以自己修改

可以通过配置文件来完成修改

  1. 手动发起快照

方法1:在登录状态,直接执行bgsave

方法2:在没有登录状态

./redis-cli bgsave

缺点:

由于快照方式是在一定间隔做一次,所以如果redis以外down掉的话,会失去最后一个快照后的所有修改

 

append-only-file 追加方式持久化AOF

本质:把用户执行的每个 ‘写’ 指令(添加,修改,删除) 都备份到文件中,还原数据的时候就是执行具体写指令而已

  1. 开启方式

打开redis.conf配置文件,进行打开配置

appendonly yes //启用aof持久化方式
appendfilename appendonly.aof // 保存命令的文件
  1. 触发条件

# appendfsync always   //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec   //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no   //完全依赖 os,性能最好,持久化没保证

  1. aof文件的重写

把多个incr指令换为一个set指令

问题 :每个命令重写一次aof,如果某个key操作100次,产生100行记录,aof文件会很大,怎么解决?

答:对aof文件进行重写,比如把执行10次incr number 压缩成 set number 11

语法:

./bin/redis/cli-a 密码 bgrewriteaof

 

 

posted @ 2019-09-19 09:02  Let_Life_Stop  阅读(168)  评论(0编辑  收藏  举报