您的位置:首页 > 数据库 > Redis

小白浅谈对redis的认识

2020-03-05 18:21 369 查看
  1. Redis 是什么

    基于键值的开源的存储服务系统

2.Redis的特征

1. 速度快:
数据存在哪里: 内存
什么语言写的: C语言
线程模式: 单线程
2. 持久化:
Redis 所有数据保存在内存中,对数据的更新将异步的保存道磁盘上。
3. 支持多种编辑语言:
基于TCP的通信协议
Java  / PHP / Python / node.js
4. 简单:
不依赖外部库  /  单线程模型
5. 多种数据结构:
String / Hash / List / Set / Zset
6. 高可用:
主从复制: 主服务器,从服务器
7. 分布式:
Redis-Cluster(V3.0)支持分布式
  1. Redis单线程架构

    串行
  2. 单线程为什么这么快:
    内存 / 非阻塞IO / 避免线程切换和竞态消耗
  3. 注意事项:
    一次只运行一条命令
    拒绝长(慢)命令
    其实不是单线程

4.Redis数据结构的内部编码(基于时间和空间选择)
1. string : raw / int / embstr
2. hash : hashtable / ziplist
3. list : linkedlist / ziplist
4. set : hashtable / intset
5. zset : skiplist / ziplist

5.基本的五种数据类型应用场景和 API

1. string类型:
场景: 缓存   计数器(转发,点赞,评论数) 分布式锁  分布式session
API :
*get key   获取key对应的value
*set key value   设置key-value
*del key    删除key-value
*incr key    key自增1,如果key不存在,自增后get(key)=1
*decr key    key自减1,如果key不存在,自减后get(key)=-1
*incrby key k    key自增k,如果key不存在,自增后get(key)=k
*decrby key k    key自减k,如果key不存在,自减后get(key)=-k
*set key value    不管key是否存在,都设置
*setnx key value    key不存在,才设置
*set key value xx    key存在,才设置
*mget key1 key2 key3    批量获取key,原子操作
*mset key1 value1 key2 value2    批量设置key-value
*getset key newvalue    set key newvalue并返回旧的value
*append key value    将value追加到旧的value
2. hash 类型:
哈希键值结构:key  field value
场景:用户信息
特点 Mapmap  filed不能相同,value可以相同
API:
*hget key field    获取hash key对应的field的value
*hset key field value    设置hash key对应field的value
*hdel key field    删除hash key对应field的value
*hexists key field    判断hash key是否有field
*hlen key    获取hash key field的数量
*hmget key field1 field2 ... fieldN    批量获取hash key的一批field对应的值
*hmset key field1 value1 field2 value2 ... fieldN valueN    批量设置hash key的一批field value
*hgetall key    返回hash key对应所有的field和value
*hvals key    返回hash key对应所有filed的value
*hkeys key    返回hash key对应所有field
3. list 类型
结构:key  elements
场景:微博TimeLine
特点: 有序  可以重复  左右两边可以插入弹入
API:
*rpush key value1 value2 ... valueN    从列表右端插入值
*lpush key value1 value2 ... valueN    从列表左端插入值
*linsert key before|after value newValue    在list指定的值前|后插入newValue
*lpop key    从列表左侧弹出一个item
*rpop    从列表右侧弹出一个item
*lrem key count value    根据count值,从列表中删除所有value相等的项
(1)count>0,从左到右,删除最多count个value相等的项
(2)count<0,从右到左,删除最多Math.abs(count)个value相等的项
(3)count=0,删除所有value相等的项
*ltrim key start end    按照索引范围修剪列表
*lrange key start end(包含end)    获取列表指定索引范围所有item
*lindex key index    获取列表指定索引的item
*llen key    获取列表长度
*lset key index newValue    设置列表指定索引值为newValue
*blpop key timeout    lpop阻塞版本,timeout是阻塞超时时间
*brpop key timeout    rpop阻塞版本,timeout是阻塞超时时间(如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。)
扩展应用:
1、LRUSH + LPOP = Stack  栈:先进后出
2、LPUSH + RPOP = Queue  队列:先进先出
3、LPUSH + BRPOP = Message Queue  消息队列
4. set 类型
结构:key calues
特点:无序 无重复 支持集合间操作
应用:抽奖系统 给用户添加标签  给标签添加用户  共同关注
API:
*sadd key element    向集合key添加element,如果element已经存在,添加失败
*srem key element    将集合key中的element移除掉
*scard key    计算集合大小
*sismember key element    判断element是否在集合中
*srandmember key count    从集合中随机挑选count个元素
*spop key    从集合中随机弹出一个元素
*smembers key    获取集合所有元素
*sdiff key1 key2    差集
*sinter key1 key2    交集
*sunion key1 key2    并集
5. zset类型
结构: key  score values
特点:无重复元素  有序
应用:排行榜
API:
*zadd key score element(可以是多对)    添加score和element
*zrem key element(可以是多个)    删除元素
*zscore key element    返回元素的分数
*zincrby key increScore element    增加或减少元素的分数
*zcard key    返回元素的总个数
*zrange key start end    返回指定索引范围内的升序元素【分值】
*zrangebyscore key minScore maxScore    返回指定分数范围内的升序元素【分值】
*zremrangebyrank key start end    删除指定排名内的升序元素
*zremrangebyscore key minScore maxScore    删除指定分数内的升序元素

6.Redis客户端 - Jedis

1. Maven 依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
2. Jedis直连

package com.it.redis.redis001;

import redis.clients.jedis.Jedis;

public class demo {

public static void main(String[] args) {
//生成一个Jedis对象,这个对象负责和指定Redis节点进行通信
Jedis jedis = new Jedis("127.0.0.1", 6379);
//jedis执行set操作
jedis.set("hello", "world");
//jedis执行get操作
String value = jedis.get("hello");//value=world

}
}
3. Jedis构造方法:
Jedis( String host, int port, int connectionTimeout, int soTimeout )
host:Redsi 节点所在机器的IP
port:Redis 节点的端口
connectionTimeout:客户端连接超时
soTimeout:客户端读写超时
4. Jedis连接池的使用:
1.从资源池姐Jedis对象
2.Jedis执行命令
3.返回执行结果
4.归还Jedis对象给连接池

转载于:https://www.cnblogs.com/guo541886/p/10477377.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
banqinggao4862 发布了0 篇原创文章 · 获赞 0 · 访问量 4 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: