Redis

本文介绍了Redis,一个高性能的Key-Value数据库。内容涵盖NoSQL的概述、Redis的用途和特性,以及Redis的基础知识,包括五大数据类型(String、List、Set、Hash、Zset)的操作和使用场景。此外,还讨论了Redis的事务、监控和Jedis操作命令。
摘要由CSDN通过智能技术生成

Redis

摘自“https://blog.csdn.net/Apandam/article/details/105468958

https://blog.csdn.net/DDDDeng_/article/details/108118544

Nosql概述

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

分类

  • 键值(Key-Value)存储数据库
  • 列存储数据库
  • 文档型数据库
  • 图形(Graph)数据库

特点

  • 易扩展
  • 大数据量,高性能
  • 灵活的数据模型
  • 高可用

Redis概述

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis能干嘛

  1. 内存存储,持久化,内存中是断电即失,所以说持久化很重要(rdb,aof)
  2. 效率高,可以用于高速缓存
  3. 发布订阅系统
  4. 地图信息分析
  5. 计时器,计数器(浏览量
  6. ……

Redis特性

  1. 多样的数据类型
  2. 持久化
  3. 集群
  4. 事务
  5. ……

基础知识

指令

  • redis默认有16个数据库
  • 默认使用第0个数据库,可以使用select切换
  • DBSIZE:查看数据库大小
  • keys * :查看数据库所有的key
  • flushdb:清空当前数据库
  • FLUSHALL:清空全部的数据库

Redis是单线程的

Redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器内存和网络带宽决定,既然可以用单线程来实现,就用单线程了

Redis为什么单线程还这么快

Redis是C语言写的,官方提供的数据为100000+QPS,完全不比同样是使用key-value的Memecache差

  • 高性能的服务器不一定是多线程的
  • 多线程不一定比单线程效率高,多线程需要CPU上下文切换

核心:redis是将所有 的数据都放在内存中的,所以说使用单线程去操作效率就是最高的,因为多线程还要CPU上下文切换,对于内存系统来说,如果没有上下文切换效率才是最高的,多次读写都是在一个CPU上的,在内存情况下,这就是最佳方案

五大数据类型

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

Redis-Key

root@iZbp1hokmzpppvxibvxgecZ:~# redis-cli
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set name ye #set key
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys * #查看所有的key
1) "age"
2) "name"
127.0.0.1:6379> exists name # 判断当前key是否存在
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> move name 1 #移除当前的key,1 是数据库的序号
(integer) 1
127.0.0.1:6379> keys *
1) "age"


127.0.0.1:6379> set name ye
OK
127.0.0.1:6379> expire name 3 #设置key变量过期时间,3为秒数
(integer) 1
127.0.0.1:6379> ttl name #查看key还有多久过期
(integer) 1
127.0.0.1:6379> keys *
1) "age"

127.0.0.1:6379> type age #查看当前key的类型
string

官网可以查看命令

String(字符串)

基本指令

127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> get key1 # 获得值
"v1"
127.0.0.1:6379> keys * #获得所有key
1) "key1"
127.0.0.1:6379> append key1 hello #给key追加字符串
(integer) 7,
127.0.0.1:6379> append newname "zhangsan" #在key不存在的情况下,相当于set key
(integer) 8

127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 #获取字符串的长度
(integer) 7
127.0.0.1:6379> append key1 ",world"
(integer) 13
127.0.0.1:6379> get key1
"v1hello,world"



自增,自减,步长
127.0.0.1:6379> set views 0
OK

127.0.0.1:6379> get views
"0"

127.0.0.1:6379> incr views # 自增 1
(integer) 1

127.0.0.1:6379> incr views 
(integer) 2

127.0.0.1:6379> get views
"2"

127.0.0.1:6379> decr views # 自减 1
(integer) 1

127.0.0.1:6379> get views
"1"

127.0.0.1:6379> incrby views 10 #自增 设置步长,指定增量10
(integer) 11

127.0.0.1:6379> decrby views 8 #自减8
(integer) 3

字符串范围
127.0.0.1:6379> set key1 "hello world" #设置key1的值
OK

127.0.0.1:6379> getrange key1 0 5 # 截取字符串,[0,5]
"hello "

127.0.0.1:6379> getrange key1 0 -2 #获取全部的字符串,和get key一样
"hello worl"

字符串替换
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xx #替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"

set
  • setex(set with expire)设置过期时间
  • setnx (set if not exist)当前不存在key的情况下设置变量才能成功(分布式锁中常使用)
127.0.0.1:6379> setex key3 30 hello # 设置key3的存活时间为30s,值为value
OK

127.0.0.1:6379> ttl key3 
(integer) 24

127.0.0.1:6379> setnx mykey rrrr # 用setnx设置mykey的值为rrrr
(integer) 1

127.0.0.1:6379> keys *
1) "mykey"
2) "key2"
3) "key1"

127.0.0.1:6379> setnx mykey rr # mykey已存在,创建失败
(integer) 0
批量设置值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量设置值
OK

127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

127.0.0.1:6379> mget k1 k2 k3 #批量取值
1) "v1"
2) "v2"
3) "v3"

127.0.0.1:6379> msetnx k1 v1 k2 v2 k3 v3 #同setnx,设置已经设置过的值就会失败
(integer) 0

127.0.0.1:6379> msetnx k1 v1 k4 v4 #msetnx是原子性操作,只要有一个失败就会全部失败
(integer) 0


设置用户

这里的key是一个巧妙的设计,user:{id}:{filed} ,如此设计在redis中完全可以

127.0.0.1:6379> set user:1 {
   name:zhangsan,age:3}
OK

127.0.0.1:6379> mset user:1:name zhangsan user:1:age 3 #作用同上
OK

127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "3"

getset

先get再set

如果不存在值,则返回nil,并且赋新值

如果存在值,先返回旧值,然后赋新值

127.0.0.1:6379> getset key 123
(nil)
127.0.0.1:6379> get key
"123"
127.0.0.1:6379> getset key hhh
"123"
127.0.0.1:6379> getset key gg
"hhh"
String类的使用场景

value除了是字符串还可以使是我们的数字

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

List

基本的数据类型,列表

在Redis里面,我们可以用list实现栈,队列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPvbIltc-1597890996518)(狂神说 Redis.assets/image-20200813114255459.png)]


127.0.0.1:6379> lpush list one #将一个值或多个值放入列表头部
(integer) 1

127.0.0.1:6379> LPUSH list two
(integer) 2

127.0.0.1:6379> lpush list three
(integer) 3

127.0.0.1:6379> lrange list 0 -1 #获取list中的值
1) "three"
2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值