首页 > 其他 > 详细

redis入门

时间:2021-02-15 10:06:08      阅读:24      评论:0      收藏:0      [点我收藏+]

概述

Redis是什么

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

redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
免费和开源!是当下最热门的NoSQL技术之一!也被称为结构化数据库

Redis能干嘛

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

特性

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

学习要用的东西
redis官网 https://redis.io/
中文网 https://www.redis.net.cn/
技术分享图片

测试性能

redis-benchmar压力测试工具 一些参数

技术分享图片

100个并发 100000个请求

redis-benchmark -h localhost -p 6379 -c 100 -n 100000

技术分享图片

基础知识

16个数据库
技术分享图片
默认使用的是第0个

127.0.0.1:6379> select 3             #选择数据库
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth "768355"         #输入密码 赋权限
OK
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> DBSIZE          #查询数据库大小
(integer) 0

技术分享图片

127.0.0.1:6379> keys *  #查询所有数据
1) "name"

FLUSHDB 清空当前数据库所有数据

FLUSHALL 清空所有数据库的数据

127.0.0.1:6379> FLUSHDB   #清空当前数据库所有数据
OK
127.0.0.1:6379> keys *
(empty list or set)

redis是单线程的

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

Redis是C语言写的 100000+QPS 不比mamecache 差

Redis为什么单线程还那么快?

1.误区1:高性能的服务器一定是多线程的?
2.误区2:多线程(CPU上下文切换)一定比单线程效率高!
CPU >内存> 硬盘速度
核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文切换:耗时的操作),
对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳方案。

五大数据类型

技术分享图片

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

Redis-key

127.0.0.1:6379> keys *   #查看所有的key
(empty list or set)
127.0.0.1:6379> set name cui  #set key
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 2
OK
127.0.0.1:6379> keys *
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
(integer) 1
127.0.0.1:6379> keys * 
1) "age"
127.0.0.1:6379> set name cui
OK
127.0.0.1:6379> set name cui
OK
127.0.0.1:6379> keys * 
1) "age"
2) "name"
127.0.0.1:6379> get name
"cui"
127.0.0.1:6379> EXPIRE name 10   #过期时间
(integer) 1
127.0.0.1:6379> ttl name     #查看当前剩余时间
(integer) 2
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> type name      #查看当前key的类型
string

遇到不知道的命令去官网查询

技术分享图片

String(字符串)

127.0.0.1:6379> set key1 v1   #设置值
OK
127.0.0.1:6379> get key1       #获取值
"v1"
127.0.0.1:6379> EXISTS key1       #判断key值是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello"  #追加字符串,如果当前key不存在,相当于setkey
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1        #获取字符串的长度
(integer) 7
127.0.0.1:6379> APPEND key1 "cui" 
(integer) 10
127.0.0.1:6379> get key1
"v1hellocui"
##################################################################################
i++
i--

127.0.0.1:6379> set views 0 #初始量为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> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> INCRBY views 10  #自增10  可设置增长量
(integer) 9
127.0.0.1:6379> DECRBY views 5       #自减5
(integer) 4

########################################################3

#字符串范围rang
127.0.0.1:6379> set key1 "hello,cui"  #设置key1的值
OK
127.0.0.1:6379> get key1
"hello,cui"
127.0.0.1:6379> GETRANGE key1 0 3  #截取字符串【0,3】
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1   #截取全部字符串  和getkey一样
"hello,cui"

# 替换!
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"

#############################################################################

# setex(set with expire) # 设置过期时间
# setnx(set if not exist)# 不存在在设置
127.0.0.1:6379> setex key3 30 "hello"      #设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 14
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> setnx mykey "redis"      #如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
3) "key2"
127.0.0.1:6379> setnx mykey "MongoDB"       #如果mykey存在,创建mykey失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
#############################################################
mset
mget

127.0.0.1:6379> mset k1 v2 k2 v2 k3 v3      #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3      #同时获取多个值
1) "v2"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4      #msetnx是一个原子性的操作
(integer) 0
127.0.0.1:6379> get k4
(nil)
##########################################################

#对象
set  user:1{name:zhangsan,age:3}#设置一个user:1 对象 值为json字符来保存一个对象
# 这里的key是一个巧妙的设计:user:{id}:{filed} 
127.0.0.1:6379>  mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
#############################################################
getset  #先get然后在set

127.0.0.1:6379> getset db redis  #如果不存在值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb      #如果存在值,获取原来的值
"redis"
127.0.0.1:6379> get db
"mongodb"

Sring类似的使用场景:value除了是我们的字符串还可以是我们的数字

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

redis入门

原文:https://www.cnblogs.com/lvshuizhicheng/p/14402071.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!