I had a somewhat similar question when I first started out. Here's my answer now, that could help others. My answer intentionally overlooks the finer details, but if you're asking a question like this - it means you're a beginner and need to first get a high level understanding.
Redis: Loosely speaking, think of Redis as an in memory database. Since it is in memory, you would expect it to be very fast, and (depending on how you're using it) not 100% reliable (i.e. you could lose some data that had been written to memory but not yet the disk)
Django-Redis: This library / package allows you to use a Redis server as a backend for your Django website, to cache pages or sessions. Remember the default backend for these within Django is Postgres, which is your traditional SQL database that saves all writes to the disk. Django has the ability to cache your webpages (that would normally be dynamically generated). Caching allows your website to be more responsive because you don't have to regenerate the page (simply serve it from the cache). Basically then what Redis does in this context is to make your cache even faster (than what it would've been with Postgres saving the cache).
Channels: Channels allows your Django website to handle WebSockets (among some other stuff). WebSockets is basically the ability for your website to send a message to a connected client, asynchronously. For example, instead of the client asking the server every few seconds "do you have a message for me?", it tells the server "whenever you have a message for me, just send it to me".
Channel Layers: Before you can understand channels_redis, you need to understand the concept of channel layers. Channel layers is a mechanism that allows data (technically messages or events) to be shared between different instances or threads. For example, if your website runs on multiple servers at the same time (for load sharing), you are running multiple instances. Or if you're using WebSockets (Channels), then each client connection would typically run in its own thread (worker). Remember that different processes/instances, don't share memory. Even different threads within the same process can't easily send events/notifications/messages to each other. You need an external communication mechanism. Theoretically you could use a database, file system or message queue (where each instance goes and checks if there is a message for them). But Django makes it easier for you to do that using Channel Layers. Imagine a chat app where two people are sending messages to each other. On the server side, you'll have two websocket connections (one with each client). Now every time a message arrives on one connection, you need to send it to the other connection. Enter channel layers
Channels_Redis: channels_redis provides you channel layers. Chances are, if you're using channel layers, you want high responsiveness. Which is why channels_redis uses redis as a backend. And according to their documentation, "channels_redis is the only official Django-maintained channel layer supported for production use".
asgi_redis: It's just an older name for channels_redis. Unless your project already uses this package, you shouldn't need to worry about it.