Redis初识

redis初识

1. Redis是什么

  • 开源
  • 基于建值对对存储服务系统
  • 多种数据结构
  • Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

官网:https://redis.io/

在这里插入图片描述

  • 高性能 ,功能丰富

2. Redis的前世今生

在这里插入图片描述

Redis的特性

  • 速度快

官方给出的 10w OPS 数据存在内存中,读取非常快 用c语言实现的(50000 line) Redis 线程模型:单线程

在这里插入图片描述

  • 持久化

Redis所有的数据保存在内存中,对数据的更新将异步地保存在磁盘上 Redis 提供了 RDB,AOF持久化方式

  • 多种数据结构

String Hash List Sets Sorted Sets


Redis 迭代中增加的数据结构

BitMaps : 位图 HyperLogLog :超小内存唯一计数 GEO :地理信息定位

  • 支持多种编程语言

在这里插入图片描述

  • 功能丰富

发布订阅 Lua脚本 事物 pipeline

  • "简单"

23000 lines of code 不依赖外部库 (like libevent) 单线程模型

  • 主从复制 在这里插入图片描述

  • 高可用,分布式

高可用 :Redis-Sentinel (v2.8 )支持高可用 分布式 :Redis-Cluster (v3.0 ) 支持分数是

Redis使用场景

  • 缓存系统
  • 计数器
  • 消息队列系统
  • 排行榜
  • 社交网络
  • 实时系统

Redis的安装

在这里插入图片描述

可执行文件说明
  • redis-server -> Redis 服务器
  • redis- cli -> Redis命令行客户端
  • redis-benchmark -> Redis性能测试
  • redis-check-aof -> AOF修复工具
  • redis-check-dump -> RDB文件检查工具
  • redis-sentinel -> Sentinel服务器(2.8以后)
Redis常用配置
  • daemonize -> 是否是守护进程(no | yes)
  • port -> Redis对外端口
  • logfileile -> Redis 系统日志
  • dir -> Redis工作目录
  • RDB config
  • AOF config
  • slow Log config
  • maxMemory等等

数据结构和内部编码

在这里插入图片描述

单线程为什么这么快

  1. 纯内存
  2. 非阻塞IO
  3. 避免线程切换和竞争消耗

Redis API的使用和理解

1. 通用命令

keys : 遍历所有key

localhost:6379> keys *
 1) "b"
 2) "blog:90"
 3) "blog:71"
 4) "blog:80"
 5) "myset"
 6) "Back3"

dbsize : db长度

localhost:6379> dbsize
(integer) 21

exisits key : 判断key是否存在

localhost:6379> exists a
(integer) 1

del key :删除key

localhost:6379> del a
(integer) 1

expire key seconds :给key设置过期时间(秒)

localhost:6379> expire a 20
(integer) 1

ttl key :查看key 还有多长时间过期 (注:-1 永不过期,-2不存在) persist key :去掉key的 过期时间

localhost:6379> ttl a
(integer) -2
localhost:6379> set a b
OK
localhost:6379> expire a 50
(integer) 1
localhost:6379> persist a
(integer) 1

type key :查看key 类型

localhost:6379> type a
string


#### 2. 字符串类型

set 、 get 、 del 操作

localhost:6379> set a b
OK
localhost:6379> get a
"b"
localhost:6379> del a
(integer) 1

incr key 自增1,如果key不存在,自增后 get(key) = 1

decr key 自减1,如果key不存在,自减后get(key) = -1

incrby key k ,如果key不存在,自增后get(key) = k

localhost:6379> incr a
(integer) 4
localhost:6379> incr a
(integer) 5
localhost:6379> incr a
(integer) 6
localhost:6379> decr a
(integer) 5
localhost:6379> decr a
(integer) 4
localhost:6379> incrby a 20
(integer) 24

set key value : 进行覆盖操作,不管key是否存在

setnx key :不存在,才设置

setxx :key 存在,才设置

localhost:6379> set a 1234
OK
localhost:6379> SETNX a 20
(integer) 0
localhost:6379> setnx b 20
(integer) 0
localhost:6379> setnx yxl 20
(integer) 1
localhost:6379> set a b xx
OK

mget key1 key2 key3 : 批量获取key,原子操作

mset key1 value1 key2 value2 : 批量设置key - value

localhost:6379> mget a b
1) "b"
2) "456"
localhost:6379> mset a 200 b 500
OK

getset key newvalue : set key newvalue 并返回旧的value

append key value : 将value 追加到旧到value

strlen key :返回字符串到长度

localhost:6379> getset a a
"200"
localhost:6379> APPEND a bcd
(integer) 4
localhost:6379> get a
"abcd"
localhost:6379> strlen a
(integer) 4

incrbyfloat key 3.5 : 增加key 对应的值3.5

getrange key start end : 获取字符串指定下标的所有值

setrange key index value :设置指定下标新的值

localhost:6379> incrbyfloat max 3.5
"3.5"
localhost:6379> getrange max 0 1
"3."
localhost:6379> setrange max 1 23
(integer) 3
localhost:6379> get max
"323"

  • 哈希类型

hget key field : 获取hash key 对应的field 的value

hset key field value : 设置hash key 对应的field 的 value

hdel key fiela

localhost:6379> hget user:1:info age 
"23"
localhost:6379> hset user:1:info age 23 sex 男
(integer) 0
localhost:6379> hset user: age 23 sex 男
(integer) 2
localhost:6379> hget user: age
"23"
localhost:6379> hset user: name 1234
(integer) 1
localhost:6379> hgetall user:
1) "age"
2) "23"
3) "sex"
4) "\xe7\x94\xb7"
5) "name"
6) "1234"
localhost:6379> hdel user: age
(integer) 1

hexists : 判断hash key 是否有 field

hlen : 获取 hash key field 的数量

localhost:6379> HGETALL user:
1) "sex"
2) "\xe7\x94\xb7"
3) "name"
4) "1234"
localhost:6379> hexists user: name
(integer) 1
localhost:6379> hlen user:
(integer) 2

hmget : hmget key field1 field 2 ......

hmset : hmset key field1 value1 field2 value2 .....

localhost:6379> hmset user2 age 30 name kaka
OK
localhost:6379> hlen user2
(integer) 2
localhost:6379> hmget user2 age name
1) "30"
2) "kaka"

hgetall :返回hash key 对应所有的field 和 value

hvals :返回hash key 对应所有 field 的value

hkeys :返回hash key 对应所有field

localhost:6379> HGETALL user2
1) "age"
2) "30"
3) "name"
4) "kaka"
localhost:6379> HVALS user2
1) "30"
2) "kaka"
localhost:6379> hkeys user2
1) "age"
2) "name"

在这里插入图片描述

  • 列表类型

rpush : 从列表右端插入值(1-N个)

lpush : 从列表左端插入值(1-N个)

127.0.0.1:6379> rpush list1 1 2 3
(integer) 6
127.0.0.1:6379> lpush list2 1 2 3
(integer) 3

linsert : 在list 指定的值前|后插入 newValue

127.0.0.1:6379> linsert list2 before 2 1234
(integer) 4
127.0.0.1:6379> linsert list2 after 2 1234
(integer) 5

lpop : 从列表左侧弹出一个item

rpop : 从列表右侧弹出一个item

127.0.0.1:6379> lpop list2
"3"
127.0.0.1:6379> rpop list2
"1"

lrem : 根据count值,从列表中删除所有value相等的项

127.0.0.1:6379> lrem list1 0 1
(integer) 2

ltrim : 按照索引范围修剪列表

lrange :获取列表指定索引范围所有item

OK
127.0.0.1:6379> lrange list2 0 -1
1) "1234"
2) "2"
3) "1234"

lindex : 获取指定列表的item

llen : 获取列表长度

lset : 设置列表指定索引值为newValue

127.0.0.1:6379> LINDEX list1 0
"3"
127.0.0.1:6379> llen list1
(integer) 2
127.0.0.1:6379> lset list1 0 1234
OK
127.0.0.1:6379> lrange list1 0 -1
1) "1234"
2) "3"

  • 集合类型

sadd : 向集合key添加element(如果存在就添加失败)

scard : 计算集合大小

sismember : 判断it 是否在集合中

srandmember : 从集合中随机挑count 个元素

spop : 从集合中随机弹出一个元素\

127.0.0.1:6379> sadd set1 1234
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> scard set1
(integer) 1
127.0.0.1:6379> sismember set1 1
(integer) 0
127.0.0.1:6379> sismember set1 1234
(integer) 1
127.0.0.1:6379> SRANDMEMBER set1 2
1) "1234"
2) "7"
127.0.0.1:6379> spop set1 1
1) "6"


  • 有序集合类型

在这里插入图片描述 zadd : 添加score 和 element

zrem : 删除元素

127.0.0.1:6379> zadd zset 1 1234
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> zrem zset 1234
(integer) 1

zincrby : 增加或减少元素的分数

zcard : 返回元素的总个数

zscore : 返回分数

127.0.0.1:6379> ZINCRBY zset 1 1
"1"
127.0.0.1:6379> zcard zset
(integer) 1
127.0.0.1:6379> zscore zset 1
"1"

zrange : 返回指定索引内升序元素

zrangebyscore : 返回指定分数范围内升序元素

zremrangebyrank : 删除指定排名内升序元素

zremrangebyscore : 删除指定分数内升序元素

127.0.0.1:6379> zadd player 1000 ronaldo 900 messi 800 c-aa
(integer) 3
127.0.0.1:6379> zrange player 0 -1
1) "c-aa"
2) "messi"
3) "ronaldo"
127.0.0.1:6379> zcount player 900 1000
(integer) 2
127.0.0.1:6379> zrangebyscore player 1000 1001
1) "ronaldo"
127.0.0.1:6379> 
127.0.0.1:6379> zremrangebyrank player 0 1
(integer) 2
127.0.0.1:6379> zrange player 0 -1
1) "ronaldo"

在这里插入图片描述

end
  • 作者:yxl(联系作者)
  • 发表时间:2020-10-02 12:28
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论