Redis学习

Redis学习

Redis
User类
class User
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }
引用
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Newtonsoft.Json; //需要nuget包引入Newtonsoft
using ServiceStack.Redis; 
1.redis 单个值存取读取
    using (IRedisClient client = new RedisClient("127.0.0.1", 6379))
            {
                //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
                     //新增key 默认的是做了序列化存储
                client.Set<string>("name", "clay");
                //读取 一般不建议使用 会显示双引号
                var values = client.GetValue("name");
                Console.WriteLine(values);
                //推荐使用,帮助我们反序列化
                var values1 = client.Get<string>("name");
                Console.WriteLine(values1);

                var values2 = client.GetValue("name");
                Console.WriteLine(JsonConvert.DeserializeObject<string>(values2));
    }
2 批量操作
using (IRedisClient client = new RedisClient("127.0.0.1", 6379))
            {
       //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
             var dics = new Dictionary<string, string>();
                dics.Add("id", "001");
                dics.Add("name", "clacy");
                dics.Add("address", "南京");
                client.SetAll(dics);
                //批量读取
                var a = client.GetAll<string>(new string[] { "id", "name", "address" });
                foreach (var d in a)
                {
                  Console.WriteLine(d);
                }
    }
3 设置过期时间
using (IRedisClient client = new RedisClient("127.0.0.1", 6379))
{
       //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
            client.Set<string>("name", "clay", TimeSpan.FromSeconds(1));
            Task.Delay(1 * 1000).Wait();
            //如果读取不到则返回一个""
            Console.WriteLine(client.Get<string>("name"));

            //设置特点的过期时间
            //指定在明天的这个时候过期
            client.Set<string>("age", "18", DateTime.Now.AddDays(1));
    }
4 追加
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){

   //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
   //client.AppendTo("Name", "I");
            //Console.WriteLine(client.Get<string>("Name"));
            //client.AppendTo("Name", " Love");
            //client.AppendTo("Name", "   YOU");
    }
5 获取之前的值,然后赋新值
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
    //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
          client.Set("name", "clay");
            var values = client.GetAndSetValue("name", "clay1");
            Console.WriteLine(JsonConvert.DeserializeObject<string>(values));
            Console.WriteLine("新值"+client.GetValue("name"));
    }
6 自增自减
  //自增
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
    //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
           var a = client.Increment("Count", 1);
           client.Increment("Count", 1);
            client.Increment("Count", 1);
           client.IncrementValueBy("Count", 100);
            Console.WriteLine(client.Get<int>("Count"));
           自减
            var b= client.Decrement("countb", 1);
            Console.WriteLine(b);
            Console.WriteLine(client.Get<int>("countb"));
    }
          
7 add和set的区别
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
    //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
                 //新增的时候,是判断,如果之前的又key存在。则新增失败,如果不存在,则新增才可以成功
            Console.WriteLine(client.Add<string>("name", "clay"));
            Console.WriteLine(client.Add<string>("name", "clay666"));
            //直接替换值
            Console.WriteLine(client.Set("name", 18));
            Console.WriteLine(client.Set("name", 19));
            Console.WriteLine(client.Set("name", 20));

            //扩展的
            //判断数据库中是否存在key
            Console.WriteLine(client.ContainsKey("name"));
            Console.WriteLine(client.ContainsKey("abc"));

            //当前这个key是那种类型
            client.Set<string>("name", "clay");
            client.AddItemToList("list", "123");
            var type = client.GetEntryType("list");
            Console.WriteLine(type);
    }
8 add和set的区别
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
    //删除当前数据库中的所有Key
                client.FlushDb();
                Console.WriteLine("0k");
                 //新增的时候,是判断,如果之前的又key存在。则新增失败,如果不存在,则新增才可以成功
            Console.WriteLine(client.Add<string>("name", "clay"));
            Console.WriteLine(client.Add<string>("name", "clay666"));
            //直接替换值
            Console.WriteLine(client.Set("name", 18));
            Console.WriteLine(client.Set("name", 19));
            Console.WriteLine(client.Set("name", 20));

            //扩展的
            //判断数据库中是否存在key
            Console.WriteLine(client.ContainsKey("name"));
            Console.WriteLine(client.ContainsKey("abc"));

            //当前这个key是那种类型
            client.Set<string>("name", "clay");
            client.AddItemToList("list", "123");
            var type = client.GetEntryType("list");
            Console.WriteLine(type);
    }
Hash操作
9.Hash操作
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
  string hashid = "stu";
            client.SetEntryInHash(hashid, "name", "zhansan");
            Console.WriteLine(client.GetValueFromHash(hashid, "name"));

            client.SetEntryInHash(hashid, "id", "0001");
            Console.WriteLine(client.GetValueFromHash(hashid, "iddd"));

            client.SetEntryInHash(hashid, "age", "18");
            Console.WriteLine(client.GetValueFromHash(hashid, "age"));


             //   批量的操作
             Dictionary<string, string> stu = new Dictionary<string, string>();
            stu.Add("name", "zhangsan");
                stu.Add("id", "zhangsan");
                client.SetRangeInHash(hashid, stu);
                //批量读取
                var dic = client.GetAllEntriesFromHash(hashid);
                foreach (var item in dic)
                {
                    Console.WriteLine(item.Key + ";" + item.Value);
                }
                //     如果我们hash集合中已经存在了相同的k / v的时候,则新增失败,返回false,否则可以新增成功
                Console.WriteLine(client.SetEntryInHashIfNotExists(hashid, "name", "clay"));
                Console.WriteLine(client.SetEntryInHashIfNotExists(hashid, "name", "clay2"));
                //用户信息..首先把对象做一个json序列化,然后存储在redis的string类型里面,
                //   如果我们需要改变这个对象的其中一个属性值得时候,先把这个对象json字符串读取出来反序列化,
                // 然后修改属性值,修改完成之后,在继续序列化存储进去

                client.StoreAsHash<User>(new User { ID = "001", Name = "qjw", Address = "长沙" });
                Console.WriteLine(client.GetFromHash<User>("001").Address);
}



10.读取hash里面key总数
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
  Dictionary<string, string> stu = new Dictionary<string, string>();

                stu.Add("name", "zhangsan");
                stu.Add("id", "001");
                client.SetRangeInHash(hashid, stu);
                Console.WriteLine(client.GetHashCount(hashid));
}
11 读取hash里面所有的key值与所有的value\
	using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
  Dictionary<string, string> stu = new Dictionary<string, string>();

                stu.Add("name", "zhangsan");
                stu.Add("id", "001");
                client.SetRangeInHash(hashid, stu);
                var key = client.GetHashKeys(hashid);
                foreach (var item in key)
                {
                    Console.WriteLine(item);

                }
                var values = client.GetHashValues(hashid);
                foreach (var item in values)
                {
                    Console.WriteLine(item);

                }
}
12 删除hash数据中的key的数据
	using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
    string hashid = "stu";
                Dictionary<string, string> stu = new Dictionary<string, string>();

                stu.Add("name", "zhangsan");
                stu.Add("id", "001");
                client.SetRangeInHash(hashid, stu);
                var key = client.RemoveEntryFromHash(hashid, "id");
                Console.WriteLine(client.GetHashCount(hashid));
}
13 判断hashid数据集中是否存在key的数据
	using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
    string hashid = "stu";
Dictionary<string, string> stu = new Dictionary<string, string>();
                stu.Add("name", "zhangsan");
                stu.Add("id", "001");
                client.SetRangeInHash(hashid, stu);
                var key = client.RemoveEntryFromHash(hashid, "id");
                Console.WriteLine(client.HashContainsEntry(hashid, "id"));
                Console.WriteLine(client.HashContainsEntry(hashid, "name"));
}

15 顺序添加
	using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
    string hashid = "stu";
                var caocao = new User() { ID = "001", Name = "曹操" };
                client.AddItemToList("list", JsonConvert.SerializeObject(caocao));
                var libai = new User() { ID = "001", Name = "李白" };
                client.AddItemToList("list", JsonConvert.SerializeObject(libai));
                var dingwei = new User() { ID = "001", Name = "丁伟" };
                client.AddItemToList("list", JsonConvert.SerializeObject(dingwei));

           
             
}

16 从前面向list添加 追加
	using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
    string hashid = "stu";
  
                var liubei = new User() { ID = "001", Name = "刘备" };
                client.PrependItemToList("list", JsonConvert.SerializeObject(liubei));

           
             
}

17 从后面向list添加 追加
	using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
    string hashid = "stu";
  
    var liubei1 = new User() { ID = "001", Name = "刘备11" };
                client.PushItemToList("list", JsonConvert.SerializeObject(liubei1));
                Console.WriteLine(client.GetListCount("list"));
                client.ExpireEntryAt("list", DateTime.Now.AddSeconds(20));
                Task.Delay(10 * 1000).Wait();
                Console.WriteLine(client.GetListCount("list"));             
}

18 从后面向list添加 追加
using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
    string hashid = "stu";
  
   var liubei1 = new User() { ID = "001", Name = "刘备11" };
                client.PushItemToList("list", JsonConvert.SerializeObject(liubei1));
                Console.WriteLine(client.GetListCount("list"));
                client.ExpireEntryAt("list", DateTime.Now.AddSeconds(20));
                Task.Delay(10 * 1000).Wait();
                Console.WriteLine(client.GetListCount("list"));     
} 


19.批量操作
 using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
    string  client.AddRangeToList("list", new List<string>() { "001", "002", "003" });
                var a = client.GetRangeFromList("list", 0, 1);//下标0开始读 读到下表为1的     就是一个List集合 需要遍历打印值
                Console.WriteLine(a);
                foreach (var item in a)
                {
                    Console.WriteLine(item);
                }
                // 实际效果打印 001 002 = "stu";
  
} 
 

20 list 栈操作,后进先出
 using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
var caocao = new User() { ID = "001", Name = "曹操" };
                client.AddItemToList("list", JsonConvert.SerializeObject(caocao));
                var libai = new User() { ID = "001", Name = "李白" };
                client.AddItemToList("list", JsonConvert.SerializeObject(libai));
                var dingwei = new User() { ID = "001", Name = "丁伟" };
                client.AddItemToList("list", JsonConvert.SerializeObject(dingwei));
          //      移除尾部,并返回结果
                Console.WriteLine(client.RemoveEndFromList("list"));
                Console.WriteLine(client.RemoveEndFromList("list"));
                Console.WriteLine(client.RemoveEndFromList("list"));
            //    移除尾部,并返回结果
                Console.WriteLine(client.RemoveStartFromList("list"));
                Console.WriteLine(client.RemoveStartFromList("list"));
                Console.WriteLine(client.RemoveStartFromList("list"));
  
} 
21 扩展
 using (IRedisClient client = new RedisClient("127.0.0.1", 6379)){
     client.FlushDb();
                Console.WriteLine("0k");
              //  从一个list得到尾部移除一个元素,然后把这个数据添加到另一个list的头部,并返回移动的值
     //          从之前的集合移除,然后新增到一个新的集合的头部了
                Console.WriteLine(client.PopAndPushItemBetweenLists("list", "newlist"));
                Console.WriteLine(client.PopAndPushItemBetweenLists("list", "newlist"));
                //获取当前key,的过期时间
                Console.WriteLine(client.GetTimeToLive("list"));
                //根据下标修改值
                client.SetItemInList("list", 0, "aaaa");
  
} 
<think>好的,我现在需要帮助用户学习Redis,从入门到精通。首先,用户已经提供了一些参考资料,包括引用1、2、3,我需要结合这些内容来组织回答。 首先,我应该确定用户的需求是什么。用户想要学习Redis的相关知识,从入门到精通。所以回答需要结构清晰,分阶段指导,并且提供学习资料和相关问题。 根据用户提供的引用,引用2提到Redis是内存数据库/缓存/消息队列,所以需要先介绍Redis的基本概念和应用场景。引用1和引用3涉及环境搭建和配置,以及一些参考资料链接,比如优快云的博客和另一篇博客。这些可以作为学习资料的一部分推荐给用户。 接下来,我需要按照系统级指令的要求,确保数学公式正确使用,但Redis相关的内容可能较少涉及数学公式,所以可能不需要太多这方面的处理。但如果有性能分析或算法部分,可能需要使用行内或独立公式,例如时间复杂度O(n)之类的,可以写成$O(n)$。 然后,用户要求生成相关问题,放在最后。需要确保问题与Redis相关,覆盖入门、进阶、配置优化、应用场景、高可用方案以及高级数据结构等方面。 回答的结构应该分为几个部分:入门阶段、进阶阶段、精通阶段,每个阶段推荐资料和重点内容。同时,结合用户提供的引用,例如环境搭建部分可以参考引用1和引用2,HyperLogLog部分可以参考引用3中的链接。 还需要注意引用标识的正确添加,例如在提到环境搭建时引用[^1][^2],在HyperLogLog部分引用[^3]。 最后,检查是否符合所有系统级指令:正确使用LaTeX(如果有的话),中文回答,生成相关问题,引用标识自然添加。同时,确保回答真实可靠,结构清晰,帮助用户逐步学习。 现在开始组织内容: 入门阶段需要介绍Redis的基本概念、安装配置和基础命令。引用2提到Redis是内存数据库,可以作为缓存和消息队列,这部分需要强调。引用1的环境搭建步骤需要整理,比如复制配置文件到/etc/redis,修改配置并启动。可以推荐官方文档和用户提供的优快云博客作为资料。 进阶阶段包括持久化机制、主从复制、哨兵模式、集群部署,以及数据类型的使用场景。需要结合引用中的信息,比如环境配置可能涉及持久化的设置,引用3中的HyperLogLog属于高级数据结构,可以放在进阶或精通阶段。 精通阶段涉及源码分析、性能调优、高可用方案(如Redis Cluster)、高级数据结构(HyperLogLog、Streams)。引用3中的HyperLogLog部分可以作为参考资料。 相关问题需要涵盖各个阶段的内容,例如如何选择数据结构、持久化机制的区别、集群部署步骤、性能优化方法、高可用方案比较,以及HyperLogLog的应用,这些问题可以帮助用户深入学习。 最后,确保所有引用正确对应,例如引用对应环境配置,引用对应Redis定义,引用[^3]对应HyperLogLog的参考链接。</think>### Redis学习路径:从入门到精通 #### 一、**入门阶段** 1. **核心概念** Redis是一个基于内存的键值存储系统,支持多种数据结构(字符串、哈希、列表等),常用于缓存、消息队列和实时数据分析。 关键术语:键值对、持久化(RDB/AOF)、单线程模型、数据类型(如`String`, `Hash`, `List`)。 2. **环境搭建** - **安装步骤**: ```bash # 下载源码编译安装 wget http://download.redis.io/releases/redis-6.2.6.tar.gz tar xzf redis-6.2.6.tar.gz cd redis-6.2.6 make make install ``` - **配置启动**: 复制配置文件到`/etc/redis`目录,修改`redis.conf`(如设置`daemonize yes`后台运行),启动命令:`redis-server /etc/redis/redis.conf`[^1]。 3. **基础操作** 学习`SET/GET`命令、数据类型操作(如`HSET/HGET`)、过期时间设置(`EXPIRE`)等。 **推荐资料**: - [Redis官方文档](https://redis.io/documentation) - [《Redis设计与实现》](http://redisbook.com/)(入门章节) --- #### 二、**进阶阶段** 1. **核心机制** - **持久化**: RDB(快照)通过`SAVE`或`BGSAVE`生成数据快照;AOF(追加日志)记录写操作,提供更高数据安全性。 配置示例: ```bash # redis.conf appendonly yes # 启用AOF appendfsync everysec # 每秒同步 ``` - **高可用**: 主从复制(`replicaof`配置)、哨兵模式(故障自动切换)、Redis Cluster(分布式分片)。 2. **应用场景** - **缓存**:缓存雪崩/穿透/击穿解决方案(如布隆过滤器)。 - **消息队列**:使用`List`实现队列,或`Streams`支持消费者组。 - **实时统计**:利用`HyperLogLog`估算基数(如UV统计)[^3]。 3. **推荐资料**: - [Redis实战](https://book.douban.com/subject/26612779/)(应用案例详解) - [Redis进阶笔记](https://zhangc233.github.io/2021/05/02/Redis/)(含`HyperLogLog`解析) --- #### 三、**精通阶段** 1. **源码与性能优化** - 阅读Redis源码(如事件循环`ae.c`、数据结构`dict.c`)。 - 性能调优:内存碎片整理(`MEMORY PURGE`)、慢查询分析(`SLOWLOG`)、网络瓶颈排查。 2. **高级特性** - **Lua脚本**:原子化执行复杂操作。 - **模块化扩展**:自定义数据类型(如[RedisJSON](https://redis.io/docs/stack/json/))。 - **流处理**:`Streams`支持消息持久化和消费者组。 3. **推荐资料**: - [Redis源码剖析](https://github.com/huangz1990/redis-3.0-annotated)(注释版源码) - [Redis深度历险](https://book.douban.com/subject/30386804/)(原理与优化) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值