C#redis缓存应用

摘要:
Redis Redis是一个非关系数据库,但它主要用于缓存技术。因为它是基于内存的缓存数据库,所以存储数据的方式是键值,即键值对。Redis还支持多种数据类型,如string、list、set、zset和hash。

Redis

  redis是一种非关系型数据库(关系型数据库即SQL server,MySQL等),但多用于缓存技术.因为它是一种内存告诉缓存数据库,存储数据的方式为Key-value,即键值对.而且redis还支持多种数据类型,如:string、list、set、zset(sorted set)、hash。

  redsi特点:

①redis以内存作为存储的介质,读写速率极高,远超过数据库,

②redis跟memcache不同,redis存储的数据是持久化的,不会因为断电重启造成的数据丢失.(reids的存储分为内存存储,磁盘存储和log文件三部分,重启后,redis从磁盘重新将数据加载到内存中,再通过配置文件对其进行配置,持久化的原因)

③redis可以配置集群,就像一些大公司的服务器一样,它可以建立多个redis用来缓存,而且redis不在客户端,也不再服务端,是一个独立的部分

  redis两种文件格式:

①全量数据:是把内存中的数据写入磁盘,便于下次读取文件进行夹杂

②增量请求:是将内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET,RPUSH,SADD,ZADD

Redis的安装:

  包地址:https://files.cnblogs.com/files/lbjlbj/Redis3.7z

运行->cmd->CD C: edis(C: edis CD 进入到盘符(记得有空格),上面那个解压后把它改名为redis,放到了C盘,也可以放其他盘)

C#redis缓存应用第1张

 redis-server.exe redis.windows.conf,等出现如图的实例,就证明成功了(这个控制台先不要关)

 C#redis缓存应用第2张

再开一个控制台,同样:CD C: edis 
 redis-cli.exe -h 127.0.0.1 -p 6379
 set myKey abc(myKey即Key,abc即value,set存)
 get myKey(get读)
C#redis缓存应用第3张

set auth 密码名,是用来设置密码.(如果忘记了密码:redis文件夹下redis.windows-service.conf记事本打开CTRL+F requirepass 即可)

redis在C#中的实际用法:

******在使用redis缓存时,须先启动服务器,CD C: edis redis-server.exe redis.windows.conf

dll文件:https://files.cnblogs.com/files/lbjlbj/dll.7z

可能会存在ConfigurationManager会报错,还需自行搜索添加引用,C#redis缓存应用第4张

  奉上一个封装好的Helper类

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace ConsoleApp1
{
    /// <summary>
    /// Redis 操作类
    /// </summary>
    public class RedisHelper
    {
        /// <summary>
        /// 连接字符串
        /// </summary>
        private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["RedisConnectionString"].ConnectionString;
        /// <summary>
        ////// </summary>
        private readonly object _lock = new object();
        /// <summary>
        /// 连接对象
        /// </summary>
        private volatile IConnectionMultiplexer _connection;
        /// <summary>
        /// 数据库
        /// </summary>
        private IDatabase _db;
        public RedisHelper()
        {
            _connection = ConnectionMultiplexer.Connect(ConnectionString);
            _db = GetDatabase();
        }
        /// <summary>
        /// 获取连接
        /// </summary>
        /// <returns></returns>
        protected IConnectionMultiplexer GetConnection()
        {
            if (_connection != null && _connection.IsConnected)
            {
                return _connection;
            }
            lock (_lock)
            {
                if (_connection != null && _connection.IsConnected)
                {
                    return _connection;
                }

                if (_connection != null)
                {
                    _connection.Dispose();
                }
                _connection = ConnectionMultiplexer.Connect(ConnectionString);
            }

            return _connection;
        }
        /// <summary>
        /// 获取数据库
        /// </summary>
        /// <param name="db"></param>
        /// <returns></returns>
        public IDatabase GetDatabase(int? db = null)
        {
            return GetConnection().GetDatabase(db ?? -1);
        }
        /// <summary>
        /// 设置
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="cacheTime">时间</param>
        public virtual void Set(string key, object data, int cacheTime)
        {
            if (data == null)
            {
                return;
            }
            var entryBytes = Serialize(data);
            var expiresIn = TimeSpan.FromMinutes(cacheTime);

            _db.StringSet(key, entryBytes, expiresIn);
        }
        /// <summary>
        /// 根据键获取值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual T Get<T>(string key)
        {

            var rValue = _db.StringGet(key);
            if (!rValue.HasValue)
            {
                return default(T);
            }

            var result = Deserialize<T>(rValue);

            return result;
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serializedObject"></param>
        /// <returns></returns>
        protected virtual T Deserialize<T>(byte[] serializedObject)
        {
            if (serializedObject == null)
            {
                return default(T);
            }
            var json = Encoding.UTF8.GetString(serializedObject);
            return JsonConvert.DeserializeObject<T>(json);
        }
        /// <summary>
        /// 判断是否已经设置
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual bool IsSet(string key)
        {
            return _db.KeyExists(key);
        }
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="data"></param>
        /// <returns>byte[]</returns>
        private byte[] Serialize(object data)
        {
            var json = JsonConvert.SerializeObject(data);
            return Encoding.UTF8.GetBytes(json);
        }
    }
}

AppConfig中配置:

 <connectionStrings>
    <add name="RedisConnectionString" connectionString="localhost"/>
  </connectionStrings>

最后功能实现:

class Program
    {
        static void Main(string[] args)
        {
            var s = "a";
            //RedisCacheHelper.Add("abc",s,DateTime.Now.AddDays(1));

            //Console.WriteLine("ok");

            //Console.WriteLine(RedisCacheHelper.Get<string>("abc"));
            new RedisHelper().Set("abc", s, 10);
            Console.WriteLine("ok");
            Console.ReadKey();
        }
    }

免责声明:文章转载自《C#redis缓存应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HmacSHA256算法(C# 和 Java)生成 git 密钥 步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux(Centos7)下redis5缓存服务集群分布式搭建

注意:可以查看Redis官网查看集群搭建方式,连接如下 https://redis.io/topics/cluster-tutorial 集群中应该至少有三个节点,每个节点有一备份节点。需要6台服务器。 如果条件有限,可以搭建伪分布式,以下步骤是在一台 Linux 服务器上搭建有6个节点的 Redis集群。 准备工作:安装依赖包 [root@localho...

Spring缓存注解@Cache使用

参考资料 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ http://swiftlet.net/archives/774 缓存注解有以下三个: @Cacheable @CacheEvict @CachePut @Cacheable(value=”accountCach...

java中对Redis的缓存进行操作

Redis是一个NoSQL数据库,也是一个高性能的key-value数据库。一般我们在做Java项目的时候,通常会了加快查询效率,减少和数据库的连接次数,我们都会在代码中加入缓存功能。Redis的高效缓存功能给我们解决了难题。下面我主要讲讲在Java项目中怎么去连接Redis服务器以及需要注意的事项。 1.导入必须的Jar包 使用Java操作Redis...

redis list结构

一个功能肯定有其应用场景: PUSH和POP操作,其实是队列的基本操作。Redis的list就是一个极其强大的队列系统。我们在哪些地方会用到队列呢?下面,我们说两个例子: a,评论系统 逛过微博的筒子们应该都对评论系统有了解。我们在看完一条微博之后,常常会评论一番,或者看看其他人的吐槽。每条评论的记录都是按照时间顺序排序的。我们读的时候也是这个顺序。这时,...

redis++:Redis持久化 save和bgsave区别 及 自动触发bgsave机制(二)

save:   优点:节约系统资源   缺点:直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。 bgsave:   优点:fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在BGSAVE 执行期间仍然可以继...

Laravel 缓存操作

Laravel 为不同的缓存系统提供了统一的 API。缓存配置位于 config/cache.php。 Laravel 目前支持主流的缓存后端如 File、Memcached 和 Redis 等,默认是使用文件缓存。 env文件配置 ,推荐修改这里 config/cache.php 文件,不建议直接修改 默认laravel支持缓存介质:"apc", "...